チュートリアル: Windows フォーム DataGridView コントロールのデータの妥当性検査

データ入力機能をユーザーに表示する場合は、フォームに入力されたデータを検証する必要が頻繁に生じます。 DataGridView クラスでは、データがデータ ストアにコミットされる前に検証を実行するための、便利な方法が提供されています。 開発者は、現在のセルが変更されたときに DataGridView によって発生する CellValidating イベントを処理することで、データを検証できます。

このチュートリアルでは、Northwind サンプル データベースの Customers テーブルから行を取得し、それらを DataGridView コントロールに表示します。 ユーザーが CompanyName 列のセルを編集し、そのセルから移動しようとすると、CellValidating イベント ハンドラーによって新しい会社名の文字列がチェックされ、値が空でないかどうかが確認されます。新しい値が空の文字列である場合、DataGridView では、空でない文字列が入力されるまで、ユーザーのカーソルをセルから移動できなくなります。

このトピックのコードを単一のリストとしてコピーする方法については、「方法: Windows フォーム DataGridView コントロールのデータを検証する」を参照してください。

必須コンポーネント

このチュートリアルを完了するための要件は次のとおりです。

  • Northwind SQL Server サンプル データベースがあるサーバーへのアクセス。

フォームの作成

DataGridView に入力されたデータを検証するには

  1. Form から派生し、DataGridView コントロールと BindingSource コンポーネントを含んだクラスを作成します。

    次のコード例では、基本的な初期化と、Main メソッドの記述を示しています。

    using System;
    using System.Data;
    using System.Data.SqlClient;
    using System.Windows.Forms;
    
    public class Form1 : System.Windows.Forms.Form
    {
        private DataGridView dataGridView1 = new DataGridView();
        private BindingSource bindingSource1 = new BindingSource();
    
        public Form1()
        {
            // Initialize the form.
            this.dataGridView1.Dock = DockStyle.Fill;
            this.Controls.Add(dataGridView1);
            this.Load += new EventHandler(Form1_Load);
            this.Text = "DataGridView validation demo (disallows empty CompanyName)";
        }
    
    Imports System.Data
    Imports System.Data.SqlClient
    Imports System.Windows.Forms
    
    Public Class Form1
        Inherits System.Windows.Forms.Form
    
        Private WithEvents dataGridView1 As New DataGridView()
        Private bindingSource1 As New BindingSource()
    
        Public Sub New()
    
            ' Initialize the form.
            Me.dataGridView1.Dock = DockStyle.Fill
            Me.Controls.Add(dataGridView1)
            Me.Text = "DataGridView validation demo (disallows empty CompanyName)"
    
        End Sub
    
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.Run(new Form1());
        }
    }
    
        <STAThread()> _
        Shared Sub Main()
            Application.EnableVisualStyles()
            Application.Run(New Form1())
        End Sub
    
    End Class
    
  2. データベースへの接続の詳細を処理できるようにするために、フォームのクラス定義にメソッドを実装します。

    このコード例では、データが設定された DataTable オブジェクトを返す、GetData メソッドを使用しています。 connectionString 変数は、使用しているデータベースに合った値に設定してください。

    重要

    接続文字列内に機密情報 (パスワードなど) を格納すると、アプリケーションのセキュリティに影響を及ぼすことがあります。 データベースへのアクセスを制御する方法としては、Windows 認証 (統合セキュリティとも呼ばれます) を使用する方が安全です。 詳細については、「接続情報の保護」を参照してください。

    private static DataTable GetData(string selectCommand)
    {
        string connectionString =
            "Integrated Security=SSPI;Persist Security Info=False;" +
            "Initial Catalog=Northwind;Data Source=localhost;Packet Size=4096";
    
        // Connect to the database and fill a data table.
        SqlDataAdapter adapter =
            new SqlDataAdapter(selectCommand, connectionString);
        DataTable data = new DataTable();
        data.Locale = System.Globalization.CultureInfo.InvariantCulture;
        adapter.Fill(data);
    
        return data;
    }
    
    Private Shared Function GetData(ByVal selectCommand As String) As DataTable
    
        Dim connectionString As String = _
            "Integrated Security=SSPI;Persist Security Info=False;" + _
            "Initial Catalog=Northwind;Data Source=localhost;Packet Size=4096"
    
        ' Connect to the database and fill a data table.
        Dim adapter As New SqlDataAdapter(selectCommand, connectionString)
        Dim data As New DataTable()
        data.Locale = System.Globalization.CultureInfo.InvariantCulture
        adapter.Fill(data)
    
        Return data
    
    End Function
    
  3. DataGridViewBindingSource を初期化し、データ バインディングを設定する、フォームの Load イベントのハンドラーを実装します。

    private void Form1_Load(System.Object sender, System.EventArgs e)
    {
        // Attach DataGridView events to the corresponding event handlers.
        this.dataGridView1.CellValidating += new
            DataGridViewCellValidatingEventHandler(dataGridView1_CellValidating);
        this.dataGridView1.CellEndEdit += new
            DataGridViewCellEventHandler(dataGridView1_CellEndEdit);
    
        // Initialize the BindingSource and bind the DataGridView to it.
        bindingSource1.DataSource = GetData("select * from Customers");
        this.dataGridView1.DataSource = bindingSource1;
        this.dataGridView1.AutoResizeColumns(
            DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader);
    }
    
    Private Sub Form1_Load(ByVal sender As System.Object, _
        ByVal e As System.EventArgs) Handles Me.Load
    
        ' Initialize the BindingSource and bind the DataGridView to it.
        bindingSource1.DataSource = GetData("select * from Customers")
        Me.dataGridView1.DataSource = bindingSource1
        Me.dataGridView1.AutoResizeColumns( _
            DataGridViewAutoSizeColumnsMode.AllCellsExceptHeader)
    
    End Sub
    
  4. DataGridView コントロールの CellValidating イベントと CellEndEdit イベントのハンドラーを実装します。

    CellValidating イベント ハンドラーでは、CompanyName 列のセルの値が空かどうかを確認します。 セル値が検証に失敗した場合は、System.Windows.Forms.DataGridViewCellValidatingEventArgs クラスの Cancel プロパティを true に設定します。 これにより、DataGridView コントロールで、カーソルをセルから移動できなくなります。 行の ErrorText プロパティは、説明の文字列に設定します。 これにより、エラー アイコンと、エラー テキストを含んだツールヒントが表示されます。 CellEndEdit イベント ハンドラーでは、行の ErrorText プロパティを空の文字列に設定します。 CellEndEdit イベントは、セルが編集モードを終了したときにのみ発生します (検証に失敗した場合は、このモード移行は実行できません)。

    private void dataGridView1_CellValidating(object sender,
        DataGridViewCellValidatingEventArgs e)
    {
        string headerText =
            dataGridView1.Columns[e.ColumnIndex].HeaderText;
    
        // Abort validation if cell is not in the CompanyName column.
        if (!headerText.Equals("CompanyName")) return;
    
        // Confirm that the cell is not empty.
        if (string.IsNullOrEmpty(e.FormattedValue.ToString()))
        {
            dataGridView1.Rows[e.RowIndex].ErrorText =
                "Company Name must not be empty";
            e.Cancel = true;
        }
    }
    
    void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
    {
        // Clear the row error in case the user presses ESC.
        dataGridView1.Rows[e.RowIndex].ErrorText = String.Empty;
    }
    
    Private Sub dataGridView1_CellValidating(ByVal sender As Object, _
        ByVal e As DataGridViewCellValidatingEventArgs) _
        Handles dataGridView1.CellValidating
    
        Dim headerText As String = _
            dataGridView1.Columns(e.ColumnIndex).HeaderText
    
        ' Abort validation if cell is not in the CompanyName column.
        If Not headerText.Equals("CompanyName") Then Return
    
        ' Confirm that the cell is not empty.
        If (String.IsNullOrEmpty(e.FormattedValue.ToString())) Then
            dataGridView1.Rows(e.RowIndex).ErrorText = _
                "Company Name must not be empty"
            e.Cancel = True
        End If
    End Sub
    
    Private Sub dataGridView1_CellEndEdit(ByVal sender As Object, _
        ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) _
        Handles dataGridView1.CellEndEdit
    
        ' Clear the row error in case the user presses ESC.   
        dataGridView1.Rows(e.RowIndex).ErrorText = String.Empty
    
    End Sub
    

アプリケーションのテスト

フォームをテストして、期待どおりに動作することを確認します。

フォームをテストするには

  • アプリケーションをコンパイルして実行します。

    DataGridView に、Customers テーブルからのデータが表示されます。 CompanyName 列のセルをダブルクリックすると、値を編集できます。 すべての文字を削除し、TAB キーを押してセルから移動しようとすると、DataGridView によって移動が阻止されます。 空でない文字列をセルに入力すると、DataGridView コントロールによってセルからの移動が許可されます。

次の手順

このアプリケーションは、DataGridView コントロールの機能の基礎について理解してもらうためのものです。 DataGridView コントロールの外観と動作は、次に示すいくつかの方法でカスタマイズできます。

関連項目