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

时间:2015-01-13 16:41:02

标签: 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;
    }

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

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

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

            </DataGrid>

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

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

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

我发现from this previous stackoverflow question“自动生成的列未添加到列索引”。

然后from this question我尝试更新DataGrid,以便像这样填充Columns

   taskTable.UpdateLayout();

   taskTable.Items.Refresh();

哪个没做任何事。

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

提前致谢。

2 个答案:

答案 0 :(得分:6)

连接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的文档的答案很差,这是非常错误的。

答案 1 :(得分:0)

我的解决方案是使用一种静态方法,在该方法中,您可以在网格和列名列表中进行如下传递:

    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;
                }
            }
        }
    }