【问题标题】:C# WPF - How to delete a column in DataGridC# WPF - 如何删除 DataGrid 中的列
【发布时间】:2015-08-25 14:36:43
【问题描述】:

我有这个简单的用户控制 (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; 
}

该方法获取一个通用列表,并在dataGrid中设置该列表。但是我得到了另一个字段,该字段未包含在课程中。此字段是“扩展数据”。 .

我尝试使用以下行删除/隐藏此列:

dataGrid1.Columns[1].Visibility = Visibility.Collapsed; 

dataGrid1.Columns.RemoveAt(1);

'1' 因为它总是第一列('0' 也不起作用)。 我得到这个错误:

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

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

【问题讨论】:

  • 为什么这个 WPF 截图却是一个 winform 应用?
  • 可能是嵌入在 WinForms 应用中的 WPF?
  • "C# ExtensionData" 的快速谷歌搜索表明它是一个公共属性,通常由代理添加到可序列化类中以支持往返数据传输。

标签: c# wpf datagrid


【解决方案1】:

AutoGeneratingColumn 添加到您的DataGrid

<DataGrid AutoGenerateColumns="true"
          AutoGeneratingColumn="DataGrid_OnAutoGeneratingColumn"/>

你的代码中还有一个方法:

private void DataGrid_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
if (e.PropertyName == "ExtensionData")
   {
       e.Column = null;
   }
}

这应该删除给定名称的不需要的列。 但总的来说,最好先从列表中删除不需要的列表项,然后再将列表提供给您的DataGrid。真的不可能有一列不在您的列表中。

【讨论】:

    【解决方案2】:

    datagrid 的 AutoGenerate 函数尽职尽责地通过反射将每一列报告为找到的公共属性。

    如果前提是显示未知实例,因为它是T 泛型实例,为什么代码会选择随机删除列?

    抱歉,前提没有意义。

    仍然可以绑定到通用项,但很可能使通用列表遵循特定的Interface,然后仅从该接口指定列。


    此外,如果不想显示列,请将属性从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 一个。这样更干净。
    猜你喜欢
    • 2019-10-26
    • 1970-01-01
    • 2023-03-24
    • 2013-08-15
    • 1970-01-01
    • 2018-07-09
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    相关资源
    最近更新 更多