如何在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; } 

对于相应的xaml(我已尝试使用和不使用AutoGenerateColumns="True"

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

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

 MessageBox.Show(dg.Columns.Count()); 

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

我从之前的stackoverflow问题中发现“自动生成的列未添加到列索引”。

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

  taskTable.UpdateLayout(); 

  taskTable.Items.Refresh(); 

哪个什么都没做。

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

提前致谢。

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

 dataGrid.AutoGeneratingColumn += dataGrid_AutoGeneratingColumn; void dataGrid_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { e.Column.Visibility = Visibility.Collapsed; } 

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

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

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

 dataGrid.AutoGeneratedColumns += DataGrid1_AutoGeneratedColumns; void DataGrid1_AutoGeneratedColumns(object sender, EventArgs e) { int columnsCount = DataGrid1.Columns.Count; //You can access the columns here. } 

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

我的解决方案是使用静态方法,您传入网格和列名列表,如下所示:

  public static void CollapseGridColumns(DataGrid grid, List columnNames) { foreach (var column in grid.Columns) { foreach(string columnName in columnNames) { if (column.Header.ToString().ToLower() == columnName.ToLower()) { column.Visibility = Visibility.Collapsed; break; } } } }