如何删除Datagrid中的额外列

28

我已经将DataGrid的ItemSource绑定到DataTable,但是它显示了额外的列,请问如何去掉这些列。

我的代码:

<DataGrid Name="dataGrid"  IsReadOnly="True"  VerticalAlignment="Top"
          ItemsSource="{Binding Cus}" AutoGenerateColumns="True"/>

它显示了额外的列,如何移除?

屏幕截图: enter image description here

7个回答

31
解决方案1:
为所有列设置AutoGenerateColumns="False"Width="*"
 <DataGrid x:Name="dataGrid" IsReadOnly="True" AutoGenerateColumns="False">
    <DataGrid.Columns>
       <DataGridTextColumn Binding="{Binding OrderId}" Header="OrderId" Width="*"/>
       <DataGridTextColumn Binding="{Binding ProductId}" Width="*" Header="ProductId"/>
       <DataGridTextColumn Binding="{Binding UnitPrice}" Width="*" Header="UnitPrice"/>
       <DataGridTextColumn Binding="{Binding Quantity}" Width="*" Header="Quantity"/>
       <DataGridTextColumn Binding="{Binding Discount}" Header="Discount"
                           Width="*"/>
    </DataGrid.Columns>
</DataGrid>

解决方案2: 您可以按照以下方式设置以满足您的要求。
<DataGrid HorizontalAlignment="Left" Margin="50,0,0,0" Width="500"
          Name="dataGrid" IsReadOnly="True" VerticalAlignment="Top"
          ItemsSource="{Binding Cus}" AutoGeneratingColumn="AutoGeneratingColumn"/>

 void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
 {
     e.Column.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
 }

23

您可以将HorizontalAlignment设置为Left。如此处所述

例如:

<DataGrid ItemsSource="{Binding}" HorizontalAlignment="Left"/>

22

避免的一种方法是将 AutoGenerateColumns 设置为 False(仅限于XAML 方法)。

提供自己的列集合并将最后一列的宽度设置为 *

<DataGrid x:Name="dataGrid" IsReadOnly="True" AutoGenerateColumns="False">
    <DataGrid.Columns>
       <DataGridTextColumn Binding="{Binding OrderId}" Header="OrderId"/>
       <DataGridTextColumn Binding="{Binding ProductId}" Header="ProductId"/>
       <DataGridTextColumn Binding="{Binding UnitPrice}" Header="UnitPrice"/>
       <DataGridTextColumn Binding="{Binding Quantity}" Header="Quantity"/>
       <DataGridTextColumn Binding="{Binding Discount}" Header="Discount"
                           Width="*"/>
    </DataGrid.Columns>
</DataGrid>

将列的绑定替换为模型类中相应的属性。

输出将类似于此:

此处输入图像描述

但是,如果您希望将可用空间平均分配给所有列。 您可以将所有列的宽度设置为*。 输出将类似于此:

此处输入图像描述


3

我一直在为此争论,Width="\*" 解决了我的问题,而datagrid中的 ColumnWidth="*" 在我的情况下无效。


ColumnWidth="*" 对我有用,但我必须强制重建,否则XAML设计器不会更新。 - Vimes

2

如果您想要:

  1. 保持AutoGenerateColumns="True"
  2. 保持列宽度自动调整为DataTable中的数据,而不是具有相同的宽度

则只需要将"1*"设置为最后一列。请注意:

1) Add the event handler to .xaml

2) Add the following code to .xaml.cs

    private void dataGrid_AutoGeneratedColumns(object sender, EventArgs e)
    {
        int i = ((DataGrid)sender).Columns.Count;
        DataGridColumn column = ((DataGrid)sender).Columns[i - 1];
        column.Width = new DataGridLength(1, DataGridLengthUnitType.Star);
    }


1
在DataGrid对象中添加属性ColumnWidth="*"。
<Grid>
    <DataGrid x:Name="datagridname" Margin="10" ItemsSource="{Binding}" IsReadOnly="True" ColumnWidth="*"/>
</Grid>

这只会使所有列的大小相等。 - FBaez51

0

既然这是未使用的空间,另一种方法是使用加权宽度而不是固定宽度:

<DataGrid x:Name="dataGrid" IsReadOnly="True" AutoGenerateColumns="False">
    <DataGrid.Columns>
       <DataGridTextColumn Binding="{Binding OrderId}" Header="OrderId" Width="1*"/>
       <DataGridTextColumn Binding="{Binding ProductId}" Header="ProductId" Width="1*"/>
       <DataGridTextColumn Binding="{Binding UnitPrice}" Header="UnitPrice" Width="1*"/>
       <DataGridTextColumn Binding="{Binding Quantity}" Header="Quantity" Width="1*"/>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接