如何在 DataGrid 中隐藏自动生成的列?
How to hide automatically generated columns in 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"
<!-- <DataGrid.Columns></DataGrid.Columns> -->
</DataGrid>
这导致内存违规中断。然后我做了
MessageBox.Show(dg.Columns.Count());
为了查看列是否被填充,它没有,它输出 0
即使我可以在程序中看到这些列。
我发现 from this previous Whosebug question "automatically generated columns are not added to the Columns index"。
然后 from this question 我尝试更新 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.
}
您提到的link说自动生成的列没有添加到列集合中。我刚刚注意到自动生成的列确实是添加到集合中。 link 对 System.Web.UI.WebControls.DataGrid
的文档的回答很差,这是非常错误的。
我的解决方案是使用静态方法,在其中传递网格和列名列表,如下所示:
public static void CollapseGridColumns(DataGrid grid, List<string> columnNames)
{
foreach (var column in grid.Columns)
{
foreach(string columnName in columnNames)
{
if (column.Header.ToString().ToLower() == columnName.ToLower())
{
column.Visibility = Visibility.Collapsed;
break;
}
}
}
}
我已经从 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"
<!-- <DataGrid.Columns></DataGrid.Columns> -->
</DataGrid>
这导致内存违规中断。然后我做了
MessageBox.Show(dg.Columns.Count());
为了查看列是否被填充,它没有,它输出 0
即使我可以在程序中看到这些列。
我发现 from this previous Whosebug question "automatically generated columns are not added to the Columns index"。
然后 from this question 我尝试更新 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.
}
您提到的link说自动生成的列没有添加到列集合中。我刚刚注意到自动生成的列确实是添加到集合中。 link 对 System.Web.UI.WebControls.DataGrid
的文档的回答很差,这是非常错误的。
我的解决方案是使用静态方法,在其中传递网格和列名列表,如下所示:
public static void CollapseGridColumns(DataGrid grid, List<string> columnNames) { foreach (var column in grid.Columns) { foreach(string columnName in columnNames) { if (column.Header.ToString().ToLower() == columnName.ToLower()) { column.Visibility = Visibility.Collapsed; break; } } } }