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プロパティはnullです。DataTableがいっぱいになるまで待つと、dataGridView.Columnsプロパティが設定されます。

DataTable.Columnsプロパティは、テーブルがいっぱいになる前に設定されます。

DataTableをDataGridにバインドするときに他に何かする必要がありますか?リフレクションを介してDataTableを動的に構築しているため、XAMLでは何もできません。

編集:

Columns.Countをチェックする限り、コードをAutoGeneratedColumnsイベントハンドラー(2回呼び出されるようです)に移動しました。データにアクセスできます。

ただし、列の可視性または表示インデックスのいずれかを設定できますが、両方を設定することはできません。両方を実行しようとすると、WPFToolkitDataGridコードの他の場所でインデックスが範囲外の例外になります。誰かがなぜ何か考えを持っていますか?

私のコードは次のとおりです。

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は私のメソッドの1つです:

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イベントはこれに最適だと思います。自動生成された列ごとに1回起動します。この時点で列のプロパティを変更するか(可視性の設定など)、e.Cancel = trueその列がまったく作成されないようにすることができます。

于 2009-04-09T14:34:22.483 に答える
0

私が見た行動は正しく、ダニエルの答えが私を正しい方向に向けた後にのみ列にアクセスできることに気づきました(100%正しくはありませんでしたが)。ただし、これにより、可視性と表示インデックスの両方を設定しようとすると、その後の問題が発生しました。

Codeplexディスカッション掲示板で表示インデックスと可視性の両方を設定できないという問題を報告しましたが、この返信が返ってきました。

これは確かにバグであり、問​​題を追跡するためにデータベースにバグを報告しました。

Loadedイベント内でバックグラウンド優先度でDispatcher.BeginInvokeを呼び出すことにより、問題を回避してみることができます。ページが定常状態に達した後に順序を変更しても、問題は発生しないようです。

この回避策を確認するかどうかはわかりません。私は学習演習としてWPFでWinFormsアプリを書き直していましたが、この作業を行うことはそれほど重要ではありません。

アップデート

2009年3月のラベルが付いたバージョン3.5.40320.1を使用していました。

2009年6月のラベルが付いたバージョン3.5.40619.1に更新したところ、可視性と表示インデックスの両方を設定する際の問題が修正されました。

于 2009-04-10T20:59:05.410 に答える