チュートリアル: Windows フォーム DataGridView コントロールでのデータ入力中に発生したエラーの処理
基礎となるデータ ストアからのエラーを処理することは、データ入力アプリケーションに必要な機能です。 Windows フォームの DataGridView コントロールを使用すると、データ ストアによって制約違反やビジネス規則の違反が検出されたときに発生する DataError イベントが公開されているので、これを簡単に実現できます。
このチュートリアルでは、Northwind サンプル データベースの Customers
テーブルから行を取得し、それらを DataGridView コントロールに表示します。 新しい行や編集された既存の行で CustomerID
の値の重複が検出されると、DataError イベントが発生します。これは、例外を説明する MessageBox が表示され、処理されます。
このトピックのコードを 1 つの一覧としてコピーするには、「方法: Windows フォーム DataGridView コントロールでのデータ入力中に発生したエラーを処理する」を参照してください。
必須コンポーネント
このチュートリアルを完了するための要件は次のとおりです。
- Northwind SQL Server サンプル データベースがあるサーバーへのアクセス。
フォームの作成
DataGridView コントロールでデータ入力エラーを処理するには
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
データベースへの接続の詳細を処理できるようにするために、フォームのクラス定義にメソッドを実装します。
このコード例では、データが設定された 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
DataGridView と BindingSource を初期化し、データ バインディングを設定する、フォームの 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
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 コントロールの外観と動作は、次に示すいくつかの方法でカスタマイズできます。
境界線とヘッダーのスタイルを変更する。 詳細については、「方法: Windows フォーム DataGridView コントロールの境界線とグリッド線のスタイルを変更する」を参照してください。
DataGridView コントロールへのユーザー入力を有効化または制限する。 詳細については、「方法: Windows フォーム DataGridView コントロールで行が追加および削除されないようにする」および「方法: Windows フォームの DataGridView コントロールで列を読み取り専用にする」を参照してください。
DataGridView コントロールへのユーザー入力を検証します。 詳細については、「チュートリアル: Windows フォーム DataGridView コントロールのデータの妥当性検査」を参照してください。
仮想モードを使用して、非常に大きなデータ セットを処理する。 詳細については、「チュートリアル: Windows フォーム DataGridView コントロールでの仮想モードの実装」を参照してください。
セルの外観をカスタマイズする。 詳細については、「方法: Windows フォームの DataGridView コントロールのセルの外観をカスタマイズする」および「方法: Windows フォーム DataGridView コントロールの既定のセル スタイルを設定する」を参照してください。
関連項目
.NET Desktop feedback