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

DOBON.NET

DataGridViewのセルに入力された値が正しいか確かめる

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

ユーザーがセルに入力した値が正しいかどうかを調べ、正しくなければ入力をキャンセルするには、CellValidatingイベントを使用します。

以下に示す例では、"Column1"列のセルが空である時、その行にエラーテキストを設定して、別のセルにフォーカスが移らないようにしています。

[VB.NET]
'CellValidatingイベントハンドラ
Private Sub DataGridView1_CellValidating(ByVal sender As Object, _
        ByVal e As DataGridViewCellValidatingEventArgs) _
        Handles DataGridView1.CellValidating
    Dim dgv As DataGridView = CType(sender, DataGridView)

    If dgv.Columns(e.ColumnIndex).Name = "Column1" AndAlso _
            e.FormattedValue.ToString() = "" Then
        '行にエラーテキストを設定
        dgv.Rows(e.RowIndex).ErrorText = "値が入力されていません。"
        '入力した値をキャンセルして元に戻すには、次のようにする
        'dgv.CancelEdit()
        'キャンセルする
        e.Cancel = True
    End If
End Sub

'CellValidatedイベントハンドラ
Private Sub DataGridView1_CellValidated(ByVal sender As Object, _
        ByVal e As DataGridViewCellEventArgs) _
        Handles DataGridView1.CellValidated
    Dim dgv As DataGridView = CType(sender, DataGridView)
    'エラーテキストを消す
    dgv.Rows(e.RowIndex).ErrorText = Nothing
End Sub
[C#]
//CellValidatingイベントハンドラ
private void DataGridView1_CellValidating(object sender,
    DataGridViewCellValidatingEventArgs e)
{
    DataGridView dgv = (DataGridView)sender;

    if (dgv.Columns[e.ColumnIndex].Name == "Column1" &&
        e.FormattedValue.ToString() == "")
    {
        //行にエラーテキストを設定
        dgv.Rows[e.RowIndex].ErrorText = "値が入力されていません。";
        //入力した値をキャンセルして元に戻すには、次のようにする
        //dgv.CancelEdit();
        //キャンセルする
        e.Cancel = true;
    }
}

//CellValidatedイベントハンドラ
private void DataGridView1_CellValidated(object sender,
    DataGridViewCellEventArgs e)
{
    DataGridView dgv = (DataGridView)sender;
    //エラーテキストを消す
    dgv.Rows[e.RowIndex].ErrorText = null;
}

CellValidatingイベントハンドラには、DataGridViewCellValidatingEventArgsオブジェクトが渡されます。このFormattedValueプロパティを検査することにより、正しい値であるかを判断します。ただしこの値は、表示用の書式指定済みの値であり、セルの本当に値ではありません。

CancelプロパティをTrueにすることにより、セルに入力された値を確定しないようにします。この時、現在のセルが別のセルに移動できないようになります。

行のErrorTextプロパティを使用して、その行のヘッダーセルにエラーアイコンを表示しています。エラーアイコンについては、こちらで説明しています。

補足:編集中のセルにはエラーアイコンが表示されないため、上記の例でセルのErrorTextプロパティにエラーテキストを設定しても、エラーアイコンが表示されません。編集中のセルにエラーアイコンを表示する方法は、「How do I show the error icon when the user is editing the cell?」で説明されています。

このエラーテキストは適当なタイミング(正しい値が入力された時)で消す必要があります。CellValidatedやCellEndEditイベントハンドラで消すのが適当でしょう。上記の例では、CellValidatedイベントを使用しています。

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

  • イベントハンドラの意味が分からない、C#のコードをそのまま書いても動かないという方は、こちらをご覧ください。