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

DataGridViewにエラーアイコンを表示する

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

ユーザーに注意を促すために、DataGridViewにエラーアイコンを表示することができます。エラーアイコンは下図のような赤丸に「!」のアイコンで、マウスポインタを合わせると、エラーテキストがツールヒントとして表示されます。

エラーアイコン

エラーアイコンは、セルと行ヘッダーに表示することができます(列ヘッダーには表示されません)。

ErrorTextプロパティ

エラーアイコンをセルに表示するには、セルのErrorTextプロパティにエラーテキスト(エラーアイコンにマウスポインタを合わせた時に表示される文字列)を設定します。また、DataGridView.ShowCellErrorsプロパティがTrueである必要があります(デフォルトでTrueです)。

エラーアイコンを行ヘッダーに表示するには、行のErrorTextプロパティにエラーテキストを設定します。また、DataGridView.ShowRowErrorsプロパティがTrueである必要があります(デフォルトでTrueです)。

表示したエラーアイコンを消すには、ErrorTextプロパティに空の文字列(""や、String.Empty)やNothing(C#では、null)を設定します。

VB.NET
コードを隠すコードを選択
'(0, 0)のセルにエラーアイコンを表示する
DataGridView1(0, 0).ErrorText = "セルの値を確認してください。"

'インデックスが3の行にエラーアイコンを表示する
DataGridView1.Rows(3).ErrorText = "負の値は入力できません。"
C#
コードを隠すコードを選択
//(0, 0)のセルにエラーアイコンを表示する
DataGridView1[0, 0].ErrorText = "セルの値を確認してください。";

//インデックスが3の行にエラーアイコンを表示する
DataGridView1.Rows[3].ErrorText = "負の値は入力できません。";

なお、セルが編集中の場合は、セルのエラーアイコンは表示されません。編集中でも表示する方法は、「How do I show the error icon when the user is editing the cell?(リンク切れのため、Internet Archiveへのリンク)」で紹介されています。

CellErrorTextNeeded、RowErrorTextNeededイベント

現在の状態に応じてセルにエラーアイコンを表示するには、CellErrorTextNeededイベントを使用します。

また、大量のデータを扱っており、多くのセルにエラーアイコンを表示する場合は、セルのErrorTextプロパティに値を設定する方法ではなく、CellErrorTextNeededイベントを使用したほうがパフォーマンスが向上します。

同じように、行ヘッダーにエラーアイコンを表示する場合は、RowErrorTextNeededイベントを使用します。

ただしこれらのイベントは、DataSourceプロパティが設定されているか、VirtualModeプロパティがTrueの時にしか発生しません。

以下に、CellErrorTextNeededとRowErrorTextNeededイベントを使用してエラーアイコンを表示する例を示します。

VB.NET
コードを隠すコードを選択
'CellErrorTextNeededイベントハンドラ
Private Sub DataGridView1_CellErrorTextNeeded(ByVal sender As Object, _
        ByVal e As DataGridViewCellErrorTextNeededEventArgs) _
        Handles DataGridView1.CellErrorTextNeeded
    Dim dgv As DataGridView = CType(sender, DataGridView)
    'セルの値が負の整数であれば、エラーアイコンを表示する
    Dim cellVal As Object = dgv(e.ColumnIndex, e.RowIndex).Value
    If TypeOf cellVal Is Integer AndAlso CInt(cellVal) < 0 Then
        e.ErrorText = "負の整数は入力できません。"
    End If
End Sub

'RowErrorTextNeededイベントハンドラ
Private Sub DataGridView1_RowErrorTextNeeded(ByVal sender As Object, _
        ByVal e As DataGridViewRowErrorTextNeededEventArgs) _
        Handles DataGridView1.RowErrorTextNeeded
    Dim dgv As DataGridView = CType(sender, DataGridView)
    If dgv("Column1", e.RowIndex).Value Is DBNull.Value AndAlso _
        dgv("Column2", e.RowIndex).Value Is DBNull.Value Then
        e.ErrorText = _
            "少なくともColumn1とColumn2のどちらかには値を入力してください。"
    End If
End Sub
C#
コードを隠すコードを選択
//CellErrorTextNeededイベントハンドラ
private void DataGridView1_CellErrorTextNeeded(object sender,
    DataGridViewCellErrorTextNeededEventArgs e)
{
    DataGridView dgv = (DataGridView)sender;
    //セルの値が負の整数であれば、エラーアイコンを表示する
    object cellVal = dgv[e.ColumnIndex, e.RowIndex].Value;
    if (cellVal is int && ((int)cellVal) < 0)
    {
        e.ErrorText = "負の整数は入力できません。";
    }
}

//RowErrorTextNeededイベントハンドラ
private void DataGridView1_RowErrorTextNeeded(object sender,
    DataGridViewRowErrorTextNeededEventArgs e)
{
    DataGridView dgv = (DataGridView)sender;
    if (dgv["Column1", e.RowIndex].Value == DBNull.Value &&
        dgv["Column2", e.RowIndex].Value == DBNull.Value)
    {
        e.ErrorText = 
            "少なくともColumn1とColumn2のどちらかには値を入力してください。";
    }
}

このように、イベントハンドラで「e.ErrorText」にエラーテキストを設定します。もし、セル(または行)のErrorTextプロパティがすでに設定されているならば、「e.ErrorText」には、設定されているErrorTextプロパティの値が入っています。よって、セルのErrorTextプロパティを無視するには、「e.ErrorText」に空の文字列を代入します。

  • 履歴:
  • 2016/5/30 リンク切れを修正。

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

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。
  • .NET Tipsをご利用いただく際は、注意事項をお守りください。