2

Avatar 列を追加したい DataTable にバインドされた DataGridView があります。列はアンバインドされます。私はそれを行うために次のコードを使用しています:

if (MyIcons != null)
{
    DataGridViewImageColumn imageColumn = new DataGridViewImageColumn();

    imageColumn.Name = "Avatar";
    imageColumn.HeaderText = "";
    imageColumn.DefaultCellStyle.NullValue = null;

    ViewRolesDataGrid.Columns.Insert(0, imageColumn);

    foreach (DataGridViewRow row in ViewRolesDataGrid.Rows)
    {
        Guid iconGuid = (Guid)row.Cells["ID_Picture"].Value;

        if (MyIcons.Icons32x32.ContainsKey(iconGuid))
        {
            Image bm = MyIcons.Icons32x32[iconGuid];

            DataGridViewImageCell cell = row.Cells["Avatar"] as DataGridViewImageCell;

            cell.Value = MyIcons.Icons32x32[iconGuid];
        }
    }
}

MyIcons は、ID_Picture GUID をデータベースから、以前にフェッチしてキャッシュした実際の画像にハッシュする一連の辞書を含むクラスです (そのため、クエリを実行して画像データを送り返すたびに images テーブルに結合する必要はありません)。MyIcons キャッシュが正常にインスタンス化され、画像が含まれていることを確認しました。上の画像「bm」には、32x32 の 32 ビットのビットマップが含まれています。

プログラムを実行すると、バインドされていない画像列がビューに表示されますが、画像はレンダリングされません。値が null であるかのように動作します (DefaultCellStyle.NullValue の変更が影響します)。画像テーブルで完全結合を実行して、DataTable で画像にバインドされた列を作成すると、画像が表示されます。

誰でも私のエラーを見つけることができますか?

ありがとう。

編集:ビットマップをセルに直接割り当てても機能しません。つまり、その列には何も表示されません。

cell.Value = Bitmap.FromFile("picture_32x32.png");
4

2 に答える 2

1

CellFormatting イベント ハンドラを持つ必要はありません。http://csharp.net-informations.com/datagridview/csharp-datagridview-image.htmにある非常に単純なサンプルは完全に機能します。まず、小さな画像(fi 100 x 100 ピクセル)に注意してください。画像が「表示」されていない場合は、「画像の列」を拡大します。

于 2013-12-10T09:38:36.800 に答える
1

解決済み: OK Don のリンクは基本的に正しかった。次のように、フォーマットイベントでそれを行う必要があるようです:

private void ViewRolesDataGrid_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    if (ViewRolesDataGrid.Columns[e.ColumnIndex].Name == "Avatar")
    {
        DataGridViewRow row = ViewRolesDataGrid.Rows[e.RowIndex];

        Guid iconGuid = (Guid)row.Cells["ID_Picture"].Value;

        Image icon = null;

        if (MyIcons.Icons32x32.ContainsKey(iconGuid))                
        {
            icon = (Image)MyIcons.Icons32x32[iconGuid];
        }

        if(icon != null)
        {
            DataGridViewImageCell cell = row.Cells["Avatar"] as DataGridViewImageCell;

            cell.Value = icon;
        }              
    }
}
于 2013-06-03T14:56:25.250 に答える