0

我使用反射创建了一个 DataTable 以从我的类中获取属性并将其设置为我的 Microsoft.Windows.Controls.DataGrid 的 DataContext:

// Create the columns based on the data in the album info - get by reflection
var ai = new AlbumInfo();
Type t = ai.GetType();

dataTable.TableName = t.Name;

foreach (PropertyInfo p in t.GetProperties())
{
    var columnSpec = new DataColumn();
    // If boolean or int type can create directly into grid, else create a text box
    if (p.PropertyType == typeof(bool) || p.PropertyType == typeof(int))
    {
        columnSpec.DataType = p.PropertyType;
    }
    else
    {
        columnSpec.DataType = typeof(string);
    }
    columnSpec.ColumnName = p.Name;
    dataTable.Columns.Add(columnSpec);
}

dataGridView.DataContext = dataTable;

AlbumInfo 包含 Title、Artist、BitRate、HasImage 等属性。

我试图在 DataTable 填充数据之前设置 DataGrid 中某些列的可见性。但是,dataGridView.Columns 属性为空。如果我等到填充 DataTable 之后,则设置 dataGridView.Columns 属性。

DataTable.Columns 属性是在表格填充之前设置的。

将 DataTable 绑定到 DataGrid 时,我还需要做些什么吗?我无法在 XAML 中做任何事情,因为我正在通过反射动态构建 DataTable。

编辑:

我已将代码移至 AutoGeneratedColumns 事件处理程序(似乎被调用了两次),因此只要检查 Columns.Count 我就可以访问数据。

但是,我可以设置列可见性或显示索引 - 但不能同时设置。如果我尝试同时执行这两项操作,我会在 WPFToolkit DataGrid 代码的其他地方得到索引超出范围异常。任何人有任何想法为什么?

我的代码是:

foreach (object columnData in Properties.Settings.Default.ColumnData)
{
    DataGridColumn column = dataGridView.Columns[index];
    column.DisplayIndex = columnData.DisplayIndex;
    column.Visibility = columnData.Visible ? Visibility.Visible : Visibility.Hidden;

    AddContextMenuItem(dataGridView.ContextMenu, columnData.Header, index++, columnData.Visible);
}

AddContextMenuItem 是我的方法之一:

private void AddContextMenuItem(ContextMenu contextMenu, string columnName, int index, bool visible)
{
    var menuItem = new MenuItem() { Header = columnName, Tag = index, IsCheckable = true, IsChecked = visible };
    menuItem.Click += new RoutedEventHandler(contextMenu_onClick);
    contextMenu.Items.Add(menuItem);
}
4

2 回答 2

2

我是否了解您想要控制自动生成的列的可见性?我认为 DataGrid 的 AutoGeneratingColumn 事件将是完美的。它为每个自动生成的列触发一次。此时您可以修改列的属性(例如设置可见性)或完全e.Cancel = true阻止创建该列

于 2009-04-09T14:34:22.483 回答
0

我意识到我看到的行为是正确的,我只能在丹尼尔的回答指出我正确的方向后访问这些列(即使它不是 100% 正确)。然而,这导致了尝试设置可见性和显示索引的后续问题。

我报告了无法在 Codeplex 讨论板上同时设置显示索引和可见性的问题,并且刚刚收到此回复:

这确实是一个错误,我们已经在我们的数据库中提交了一个错误来跟踪问题。

您可以尝试通过在 Loaded 事件中以后台优先级调用 Dispatcher.BeginInvoke 来解决此问题。如果在页面达到稳定状态后更改订单,似乎不会出现此问题。

我不确定我是否会检查这个解决方法。我在 WPF 中重写了一个 WinForms 应用程序作为一个学习练习,而这项工作并不是真正重要的。

更新

我使用的是 3.5.40320.1 版本,标记为 2009 年 3 月。

我刚刚更新到版本 3.5.40619.1,标记为 2009 年 6 月,设置可见性和显示索引的问题已得到修复。

于 2009-04-10T20:59:05.410 回答