チュートリアル : Windows フォーム DataGridView コントロールでのデータ入力中に発生したエラーの処理
データ入力アプリケーションでは、基になるデータ ストアのエラーを処理する機能が必須です。 Windows フォーム DataGridView コントロールは、データ ストアが制約違反またはビジネス ルール違反を検出したときに発生する DataError イベントを公開することで、これを簡単に実現しています。
このチュートリアルでは、Northwind サンプル データベース内の Customers テーブルの行を取得して、DataGridView コントロールに表示します。 新規行または編集された既存行の中で重複する CustomerID 値が検出されたときは、DataError イベントが発生するので、この例外について説明する MessageBox を表示することでイベントを処理します。
このトピックのコードを単一のリストとしてコピーするには、「方法 : Windows フォーム DataGridView コントロールでのデータ入力中に発生したエラーを処理する」を参照してください。
必須コンポーネント
このチュートリアルを完了するための要件は次のとおりです。
- Northwind SQL Server サンプル データベースがインストールされたサーバーへのアクセス
フォームの作成
DataGridView コントロール内のデータ入力エラーを処理するには
Form から派生したクラスを作成し、DataGridView コントロールと BindingSource コンポーネントを含めます。
次のコード例は、基本的な初期化処理を行い、Main メソッドを含みます。
Imports System 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()> _ Shared Sub Main() Application.EnableVisualStyles() Application.Run(New Form1()) End Sub End Class
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); } ... [STAThread] static void Main() { Application.EnableVisualStyles(); Application.Run(new Form1()); } }
フォームのクラス定義に、データベースへの接続の詳細を処理するメソッドを実装します。
このコード例では、データが入力された DataTable オブジェクトを返す GetData メソッドを使用します。 connectionString 変数には、使用するデータベースに適した値を設定してください。
セキュリティに関するメモ 接続文字列内にパスワードなどの機密情報を格納すると、アプリケーションのセキュリティに影響を及ぼすことがあります。 データベースへのアクセスを制御する方法としては、Windows 認証 (統合セキュリティとも呼ばれます) を使用する方が安全です。 詳細については、「接続情報の保護 (ADO.NET)」を参照してください。
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
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; }
フォームの Load イベントのハンドラーを実装します。このハンドラーで、DataGridView と BindingSource を初期化し、データ バインディングを設定します。
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
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); }
DataGridView の DataError イベントを処理します。
エラーのコンテキストがコミット操作である場合は、エラーを MessageBox に表示します。
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
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."); } }
アプリケーションのテスト
フォームをテストして、期待どおりに動作することを確認します。
フォームをテストするには
F5 キーを押してアプリケーションを実行します。
DataGridView コントロールに Customers テーブルのデータが読み込まれることを確認します。 CustomerID に重複する値を入力して編集内容をコミットすると、セルの値が自動的に元に戻り、データ入力エラーを示す MessageBox が表示されます。
次の手順
このアプリケーションでは、DataGridView コントロールの基本的な機能を学ぶことができます。 次のような方法を使用すると、DataGridView コントロールの外観および動作をカスタマイズできます。
輪郭およびヘッダー スタイルを変更します。 詳細については、「方法 : Windows フォーム DataGridView コントロールの境界線とグリッド線のスタイルを変更する」を参照してください。
DataGridView コントロールへのユーザー入力を有効にするかまたは制限します。 詳細については、「方法 : Windows フォーム DataGridView コントロールで行が追加および削除されないようにする」および「方法 : Windows フォームの DataGridView コントロールで列を読み取り専用にする」を参照してください。
DataGridView コントロールへのユーザー入力を検証します。 詳細については、「チュートリアル : Windows フォーム DataGridView コントロールのデータの妥当性検査」を参照してください。
仮想モードを使用して非常に大きなデータセットを処理します。 詳細については、「チュートリアル : Windows フォーム DataGridView コントロールでの仮想モードの実装」を参照してください。
セルの外観をカスタマイズします。 詳細については、「方法 : Windows フォームの DataGridView コントロールのセルの外観をカスタマイズする」および「方法 : Windows フォーム DataGridView コントロールの既定のセル スタイルを設定する」を参照してください。
参照
処理手順
方法 : Windows フォーム DataGridView コントロールでのデータ入力中に発生したエラーを処理する
チュートリアル : Windows フォーム DataGridView コントロールのデータの妥当性検査