如何在DataGrid中隐藏自动生成的列?

Cha*_*ton 5 c# wpf xaml datagrid

我已经从SQL服务器自动从DataTable填充了DataGrid.我希望用户能够添加或删除哪些列可见.我原本试过这个:

    public void populateTaskTable(DataTable dt)
    {                    
        //add the whole datatable to the datagrid
        dg.DataContext = dt.DefaultView;

        dg.Columns[0].Visibility = Visibility.Collapsed;
    }
Run Code Online (Sandbox Code Playgroud)

对于相应的xaml(我已经尝试了有和没有 AutoGenerateColumns="True"

           <DataGrid Name="dg" ItemsSource="{Binding}" AutoGenerateColumns="True" 

                    <!-- <DataGrid.Columns></DataGrid.Columns> -->

            </DataGrid>
Run Code Online (Sandbox Code Playgroud)

这导致内存违规中断.所以我做到了

MessageBox.Show(dg.Columns.Count());
Run Code Online (Sandbox Code Playgroud)

要查看列是否正在填充,它不是,它输出一个,0即使我可以看到程序中的列.

从之前的stackoverflow问题中发现"自动生成的列未添加到列索引".

然后从这个问题我尝试更新DataGrid以获得像这样填充的列

   taskTable.UpdateLayout();
Run Code Online (Sandbox Code Playgroud)

   taskTable.Items.Refresh();
Run Code Online (Sandbox Code Playgroud)

哪个什么都没做.

有没有办法访问自动生成的DataGrid的属性,或者是将DataGrid的所有列添加到Columns组件的方法?

提前致谢.

Sri*_*vel 6

连接AutoGeneratingColumn事件并在其上隐藏列.

dataGrid.AutoGeneratingColumn += dataGrid_AutoGeneratingColumn;

void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    e.Column.Visibility = Visibility.Collapsed;
}
Run Code Online (Sandbox Code Playgroud)

您可能需要有条件地隐藏列,您可以使用

private void DataGrid_OnAutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
    if (e.PropertyName == "YourProperty")
    {
        e.Column.Visibility = Visibility.Collapsed;
    }
}
Run Code Online (Sandbox Code Playgroud)

或者您可以使用AutoGeneratedColumns事件.生成所有列时将触发它.

dataGrid.AutoGeneratedColumns += DataGrid1_AutoGeneratedColumns;

void DataGrid1_AutoGeneratedColumns(object sender, EventArgs e)
{
     int columnsCount = DataGrid1.Columns.Count;
     //You can access the columns here.
}
Run Code Online (Sandbox Code Playgroud)

您引用的链接表示自动生成的列未添加到Columns集合中.我刚刚注意到自动生成的列确实已添加到集合中.链接到文档System.Web.UI.WebControls.DataGrid非常错误的答案很差.