DOBON.NET プログラミング道: .NET Framework, VB.NET, C#, Visual Basic, Visual Studio, インストーラ, ...

DataGridViewの列に画像を表示する

注意:DataGridViewコントロールは、.NET Framework 2.0で新しく追加されました。

DataGridViewの列に画像(イメージ、アイコン)を表示するには、DataGridViewImageColumnを使用します。バイト配列、Image、Iconオブジェクトのデータをバインドすれば自動的にDataGridViewImageColumnが使用されます。

非バインド列としてDataGridViewImageColumnを追加し、画像を表示する例を示します。ここではImageオブジェクトを表示しています。

VB.NET
コードを隠すコードを選択
'DataGridViewImageColumnの作成
Dim column As New DataGridViewImageColumn()
'列の名前を設定
column.Name = "Image"
'Icon型ではなく、Image型のデータを表示する
'デフォルトでFalseなので、変更する必要はない
column.ValuesAreIcons = False
'値の設定されていないセルに表示するイメージを設定する
column.Image = New Bitmap("C:\null.gif")
'イメージを縦横の比率を維持して拡大、縮小表示する
column.ImageLayout = DataGridViewImageCellLayout.Zoom
'イメージの説明
'セルをクリップボードにコピーした時に使用される
column.Description = "イメージ"
'DataGridViewに追加する
DataGridView1.Columns.Add(column)

'"Image"列の一番上のセルのイメージを変更する
DataGridView1("Image", 0).Value = New Bitmap("C:\top.gif") '
C#
コードを隠すコードを選択
//DataGridViewImageColumnの作成
DataGridViewImageColumn column = new DataGridViewImageColumn();
//列の名前を設定
column.Name = "Image";
//Icon型ではなく、Image型のデータを表示する
//デフォルトでFalseなので、変更する必要はない
column.ValuesAreIcons = false;
//値の設定されていないセルに表示するイメージを設定する
column.Image = new Bitmap("C:\\null.gif");
//イメージを縦横の比率を維持して拡大、縮小表示する
column.ImageLayout = DataGridViewImageCellLayout.Zoom;
//イメージの説明
//セルをクリップボードにコピーした時に使用される
column.Description = "イメージ";
//DataGridViewに追加する
DataGridView1.Columns.Add(column);

//"Image"列の一番上のセルのイメージを変更する
DataGridView1["Image", 0].Value = new Bitmap("C:\\top.gif");

DataGridViewImageColumnのValuesAreIconsにより、Imageオブジェクトを表示するか、Iconオブジェクトを表示するかを指定します。Iconを表示する場合は、これをTrueにします。

値の設定されていないセルに表示する画像を設定するには、Imageプロパティを使用します。Iconを表示している場合(ValuesAreIconsがTrueの場合)は、Iconプロパティを使用します。これらのプロパティに何も設定していない時は、値の設定されていないセルに、四角に赤いXの画像が表示されます。

補足:DefaultCellStyle.NullValueプロパティに設定された画像よりもImageやIconプロパティの画像が優先されます。NullValueプロパティにはデフォルトで、四角に赤いXの画像が設定されています。

ImageLayoutプロパティには、画像をどのように表示するかを指定します。NotSetやNormal(デフォルト)を指定すると、画像の大きさはそのままに、セルの中央に表示します。Stretchでは、セルの大きさいっぱいに画像を拡大、縮小して表示します。Zoomでは、画像の幅と高さの比率を維持して、セルの大きさに合わせて画像を拡大、縮小して表示します。

値が設定されていないセルに四角に赤いXの画像が表示されないようにする

セルに何も値が設定されていない時(セルの値がnullかDBNull.Valueの時)に表示される四角に赤いXの画像は、上記の補足で説明したように、DefaultCellStyleのNullValueプロパティに設定されています。この画像が表示されないようにするには、行を追加する前に、NullValueプロパティをnull(VB.NETではNothing)にします。

VB.NET
コードを隠すコードを選択
'DataGridViewImageColumnの作成
Dim column As New DataGridViewImageColumn()
'セルスタイルのNullValueをnullにする
column.DefaultCellStyle.NullValue = Nothing
'DataGridViewに追加する
DataGridView1.Columns.Add(column)
C#
コードを隠すコードを選択
//DataGridViewImageColumnの作成
DataGridViewImageColumn column = new DataGridViewImageColumn();
//セルスタイルのNullValueをnullにする
column.DefaultCellStyle.NullValue = null;
//DataGridViewに追加する
DataGridView1.Columns.Add(column);

新しい行のセルに赤いXが表示されないようにする

上記のようにNullValueをnullにしても、DataGridView.AllowUserToAddRowsプロパティがTrueの時は、新しい行に赤いXが表示されてしまいます。これを表示しないようにするには、新しい行のセルの値をnullにします。

MSDNの「DataGridViewImageColumnクラス」には、その方法として、RowsAddedイベントで該当するセルの値をnullにする方法と、DataGridViewImageCell.DefaultNewRowValueプロパティをオーバーライドしてnullを返す方法が紹介されています。

以下に、DefaultNewRowValueプロパティをオーバーライドする方法を紹介します。まず、次のようなクラスを作成します。

VB.NET
コードを隠すコードを選択
''' <summary>
''' DefaultNewRowValueプロパティがnullを返すDataGridViewImageCell
''' </summary>
Public Class DataGridViewImageCellEx
    Inherits DataGridViewImageCell
    Public Overrides ReadOnly Property DefaultNewRowValue() As Object
        Get
            Return Nothing
        End Get
    End Property
End Class
C#
コードを隠すコードを選択
/// <summary>
/// DefaultNewRowValueプロパティがnullを返すDataGridViewImageCell
/// </summary>
public class DataGridViewImageCellEx : DataGridViewImageCell
{
    public override object DefaultNewRowValue
    {
        get
        {
            return null;
        }
    }
}

そして、このクラスのインスタンスをDataGridViewImageColumn.CellTemplateプロパティに設定します。これで、新しい行にも赤いXが表示されなくなります。

VB.NET
コードを隠すコードを選択
'DataGridViewImageColumnの作成
Dim column As New DataGridViewImageColumn()
'セルスタイルのNullValueをnullにする
column.DefaultCellStyle.NullValue = Nothing
'CellTemplateを変更する
column.CellTemplate = New DataGridViewImageCellEx()
'DataGridViewに追加する
DataGridView1.Columns.Add(column)
C#
コードを隠すコードを選択
//DataGridViewImageColumnの作成
DataGridViewImageColumn column = new DataGridViewImageColumn();
//セルスタイルのNullValueをnullにする
column.DefaultCellStyle.NullValue = null;
//CellTemplateを変更する
column.CellTemplate = new DataGridViewImageCellEx();
//DataGridViewに追加する
DataGridView1.Columns.Add(column);

セルの値によって表示する画像を決める

例えば、別の列のセルの値によりDataGridViewImageColumnのセルに表示する画像を決めたいという場合は、CellFormattingイベントを使用するとよいでしょう。CellFormattingイベントの使い方は、こちらで説明していますので、ここでは簡単な例のみを示します。

以下の例では、"Image"という名前のDataGridViewImageColumn列と、"Column1"という名前の整数型の列がDataGridViewにあるとき、"Column1"のセルの値によって"Image"に表示する画像を変更しています。

VB.NET
コードを隠すコードを選択
Private image1 As New Bitmap("C:\1.gif")
Private image2 As New Bitmap("C:\2.gif")

'CellFormattingイベントハンドラ
Private Sub DataGridView1_CellFormatting(ByVal sender As Object, _
        ByVal e As DataGridViewCellFormattingEventArgs) _
        Handles DataGridView1.CellFormatting
    Dim dgv As DataGridView = CType(sender, DataGridView)
    '"Image"列のセルか確認する
    If dgv.Columns(e.ColumnIndex).Name = "Image" AndAlso _
        e.RowIndex >= 0 AndAlso _
        TypeOf (dgv("Column1", e.RowIndex).Value) Is Integer Then
        '"Column1"列のセルの値によって表示する画像を決定する
        Select Case CInt(dgv("Column1", e.RowIndex).Value)
            Case 1
                e.Value = Me.image1
                e.FormattingApplied = True
            Case 2
                e.Value = Me.image2
                e.FormattingApplied = True
        End Select
    End If
End Sub
C#
コードを隠すコードを選択
private Bitmap image1 = new Bitmap("C:\\1.gif");
private Bitmap image2 = new Bitmap("C:\\2.gif");

//CellFormattingイベントハンドラ
private void DataGridView1_CellFormatting(object sender,
    DataGridViewCellFormattingEventArgs e)
{
    DataGridView dgv = (DataGridView)sender;
    //"Image"列のセルか確認する
    if (dgv.Columns[e.ColumnIndex].Name == "Image" &&
        e.RowIndex >= 0 &&
        dgv["Column1", e.RowIndex].Value is int)
    {
        //"Column1"列のセルの値によって表示する画像を決定する
        switch ((int)dgv["Column1", e.RowIndex].Value)
        {
            case 1:
                e.Value = this.image1;
                e.FormattingApplied = true;
                break;
            case 2:
                e.Value = this.image2;
                e.FormattingApplied = true;
                break;
        }
    }
}
  • 履歴:
  • 2016/6/7 「新しい行のセルに赤いXが表示されないようにする」を追加。「値が設定されていないセルに四角に赤いXの画像が表示されないようにする」のコードを変更。

注意:この記事では、基本的な事柄の説明が省略されているかもしれません。初心者の方は、特に以下の点にご注意ください。

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • Windows Vista以降でUACが有効になっていると、ファイルへの書き込みに失敗する可能性があります。詳しくは、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。