チュートリアル: Windows フォーム DataGridView コントロールでのデータ入力中に発生したエラーの処理

基礎となるデータ ストアからのエラーを処理することは、データ入力アプリケーションに必要な機能です。 Windows フォームの DataGridView コントロールを使用すると、データ ストアによって制約違反やビジネス規則の違反が検出されたときに発生する DataError イベントが公開されているので、これを簡単に実現できます。

このチュートリアルでは、Northwind サンプル データベースの Customers テーブルから行を取得し、それらを DataGridView コントロールに表示します。 新しい行や編集された既存の行で CustomerID の値の重複が検出されると、DataError イベントが発生します。これは、例外を説明する MessageBox が表示され、処理されます。

このトピックのコードを 1 つの一覧としてコピーするには、「方法: 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);
        }
    
    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)
    
        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, including the
        // schema information that contains the CustomerID column
        // constraint.
        SqlDataAdapter adapter =
            new SqlDataAdapter(selectCommand, connectionString);
        DataTable data = new DataTable();
        data.Locale = System.Globalization.CultureInfo.InvariantCulture;
        adapter.Fill(data);
        adapter.FillSchema(data, SchemaType.Source);
    
        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, including the 
        ' schema information that contains the CustomerID column 
        ' constraint.
        Dim adapter As New SqlDataAdapter(selectCommand, connectionString)
        Dim data As New DataTable()
        data.Locale = System.Globalization.CultureInfo.InvariantCulture
        adapter.Fill(data)
        adapter.FillSchema(data, SchemaType.Source)
    
        Return data
    
    End Function
    
  3. DataGridViewBindingSource を初期化し、データ バインディングを設定する、フォームの Load イベントのハンドラーを実装します。

    private void Form1_Load(System.Object sender, System.EventArgs e)
    {
        // Attach the DataError event to the corresponding event handler.
        this.dataGridView1.DataError +=
            new DataGridViewDataErrorEventHandler(dataGridView1_DataError);
    
        // 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 上の DataError イベントを処理します。

    エラーのコンテキストがコミット操作の場合は、エラーを MessageBox で表示します。

    private void dataGridView1_DataError(object sender,
        DataGridViewDataErrorEventArgs e)
    {
        // If the data source raises an exception when a cell value is
        // commited, display an error message.
        if (e.Exception != null &&
            e.Context == DataGridViewDataErrorContexts.Commit)
        {
            MessageBox.Show("CustomerID value must be unique.");
        }
    }
    
    Private Sub dataGridView1_DataError(ByVal sender As Object, _
        ByVal e As DataGridViewDataErrorEventArgs) _
        Handles dataGridView1.DataError
    
        ' If the data source raises an exception when a cell value is 
        ' commited, display an error message.
        If e.Exception IsNot Nothing AndAlso _
            e.Context = DataGridViewDataErrorContexts.Commit Then
    
            MessageBox.Show("CustomerID value must be unique.")
    
        End If
    
    End Sub
    

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

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

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

  • F5 キーを押してアプリケーションを実行します。

    Customers テーブルのデータが設定された DataGridView コントロールが表示されます。 CustomerID に重複した値を入力して編集をコミットすると、セルの値は自動的に元に戻り、データ入力エラーを示す MessageBox が表示されます。

次の手順

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

関連項目