C# WPF - 如何在DataGrid中删除一列

4

我有一个简单的用户控件(XAML):

<UserControl x:Class="finalProject_ClientX.queryResults"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
         xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
         mc:Ignorable="d" 
         d:DesignHeight="500" d:DesignWidth="500" Loaded="UserControl_Loaded">
<Grid Height="476" Background="#70BCE373">
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="494" />
        <ColumnDefinition Width="0*" />
        <ColumnDefinition Width="6*" />
    </Grid.ColumnDefinitions>
    <DataGrid AutoGenerateColumns="true" Height="374" HorizontalAlignment="Left" Margin="27,51,0,0" Name="dataGrid1" VerticalAlignment="Top" Width="448" SelectionChanged="dataGrid1_SelectionChanged" />
    <Label Content="Query Results" Height="54" HorizontalAlignment="Stretch" Margin="27,0,19,0" Name="label1" VerticalAlignment="Top" DataContext="{Binding}" FontFamily="Tunga" FontSize="36" FontWeight="Bold" FontStyle="Normal" Opacity="1" Foreground="#FF0059B3" HorizontalContentAlignment="Center" />
    <Button Content="Button" Height="23" HorizontalAlignment="Left" Margin="189,441,0,0" Name="button1" VerticalAlignment="Top" Width="75" />
</Grid>

我按照以下方法设置表格行:

public void setList<T>(List<T> list)
{
    dataGrid1.ItemsSource = list;

    //dataGrid1.Columns.RemoveAt(1);
    dataGrid1.Columns[1].Visibility = Visibility.Collapsed; 
}

该方法获取一个通用列表,并将该列表设置在数据网格中。但我得到了另一个字段,该字段未包含在类中。这个字段是“ExtensionData”。 .
我尝试使用以下代码删除/隐藏此列:
dataGrid1.Columns[1].Visibility = Visibility.Collapsed; 

或者

dataGrid1.Columns.RemoveAt(1);

'1' 因为它总是第一列('0' 不起作用)。 然后我收到了以下错误:

未处理的异常类型'System.ArgumentOutOfRangeException'在mscorlib.dll中发生

附加信息:索引超出范围。必须是非负数并且小于集合大小。


为什么这是WPF,但截图却是一个Winform应用程序? - ΩmegaMan
1
也许这是在WinForms应用程序中嵌入的WPF? - KornMuffin
1
一个快速的谷歌搜索"C# ExtensionData"显示它是一个公共属性,经常由代理添加到可序列化类中,以支持往返数据传输。 - Rachel
2个回答

7
AutoGeneratingColumn 添加到你的 DataGrid 中:
<DataGrid AutoGenerateColumns="true"
          AutoGeneratingColumn="DataGrid_OnAutoGeneratingColumn"/>

在您的代码后台中有一个方法:
private void DataGrid_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyName == "ExtensionData")
   {
       e.Column = null;
   }
}

这将删除给定名称的不需要的列。 但通常最好在将列表提供给您的DataGrid之前从列表中删除不需要的列表项。实际上,不能有不在列表中的列。


3
数据网格的AutoGenerate函数只是通过反射勤奋地报告每个列作为公共属性被发现。
如果假设是显示未知实例,因为它是一个T通用实例,为什么代码会选择随机删除列呢?
抱歉,这个前提毫无意义。
仍然可以绑定到通用项,但最好使通用列表遵循特定的接口,然后仅从该接口指定列。
此外,如果不想显示列,将属性从public更改为internalprivate,则不会显示。
如果想要控制数据网格,则指定要显示的列并忽略任何有问题的列。通过设置AutoGenerateColumns=False,然后在xaml中指定所需的列来完成。
<DataGrid ItemsSource="{Binding  MyData}" AutoGenerateColumns="False" >
   <DataGrid.Columns>
      <DataGridTextColumn Header="Person's Age"
                      Binding="{Binding Age}"/>
      <DataGridTextColumn Header="Birthday"
                      Binding="{Binding Birthday}"/>
      <DataGridTextColumn Header="First Name"
                      Binding="{Binding Name}"/>
   </DataGrid.Columns>
</DataGrid>

这个解决方案比 #sebingel 更好。这更加简洁。 - Raúl Otaño

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