チュートリアル : Windows フォーム DataGridView コントロールのデータの妥当性検査
更新 : 2007 年 11 月
データ入力機能をユーザーに表示する場合、フォームに入力されたデータの妥当性検査を行うことが必要になる場合があります。DataGridView クラスには、データがデータ ストアにコミットされる前に妥当性検査を実行できる便利な手段が用意されています。現在のセルが変更されたときに DataGridView で発生する CellValidating イベントを処理することで、データの妥当性検査を行うことができます。
このチュートリアルでは、Northwind サンプル データベースの Customers テーブルから行を取得し、DataGridView コントロールに表示します。ユーザーが CompanyName 列のセルを編集し、そのセルから離れようとすると、CellValidating イベント ハンドラは新しい会社名文字列が空でないかどうかを確認し、新しい値が空の文字列の場合、DataGridView は空でない文字列が入力されるまで、ユーザーのカーソルがそのセルから移動できないようにします。
このトピックのコードを単一のリストとしてコピーするには、「方法 : 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) Me.Text = "DataGridView validation demo (disallows empty CompanyName)" 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); this.Text = "DataGridView validation demo (disallows empty CompanyName)"; } ... [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. 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
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; }
DataGridView と BindingSource の初期化、およびデータ バインディングの設定を行うために、フォームの Load イベントのハンドラを実装します。
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 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); }
DataGridView コントロールの CellValidating イベントおよび CellEndEdit イベントのハンドラを実装します。
CellValidating イベント ハンドラでは、CompanyName 列のセルの値が空であるかどうかを調べます。セルの値が妥当性検査に合格しなかった場合は、System.Windows.Forms.DataGridViewCellValidatingEventArgs クラスの Cancel プロパティを true に設定します。これにより、DataGridView コントロールはカーソルがそのセルから移動することを禁止します。その行の ErrorText プロパティに説明文字列を設定します。これにより、エラー アイコンと、エラー テキストを含むツールヒントが表示されます。CellEndEdit イベント ハンドラでは、行の ErrorText プロパティに空の文字列を設定します。CellEndEdit イベントは、セルの編集モードが終了した場合にのみ発生します。そのためには、セルが妥当性検査に合格することが必要です。
Private Sub dataGridView1_CellValidating(ByVal sender As Object, _ ByVal e As DataGridViewCellValidatingEventArgs) _ Handles dataGridView1.CellValidating ' Validate the CompanyName entry by disallowing empty strings. If dataGridView1.Columns(e.ColumnIndex).Name = "CompanyName" Then If e.FormattedValue IsNot Nothing AndAlso _ String.IsNullOrEmpty(e.FormattedValue.ToString()) Then dataGridView1.Rows(e.RowIndex).ErrorText = _ "Company Name must not be empty" e.Cancel = True End If 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
private void dataGridView1_CellValidating(object sender, DataGridViewCellValidatingEventArgs e) { // Validate the CompanyName entry by disallowing empty strings. if (dataGridView1.Columns[e.ColumnIndex].Name == "CompanyName") { if (e.FormattedValue == null && 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; }
アプリケーションのテスト
フォームをテストして、期待どおりに動作することを確認します。
フォームをテストするには
アプリケーションをコンパイルして実行します。
DataGridView に、Customers テーブルからのデータが入力されて表示されます。CompanyName 列内のセルをダブルクリックすると、値を編集できます。すべての文字を削除してから、Tab キーを押してそのセルから離れようとすると、DataGridView によって阻止されます。空でない文字列をセルに入力すると、DataGridView コントロールはセルから離れることを許可します。
次の手順
このアプリケーションは、DataGridView コントロールの機能に関する基本事項を理解するのに役立ちます。DataGridView コントロールの動作と外観は、次のようなさまざまな方法でカスタマイズできます。
境界線とヘッダーのスタイルの変更。詳細については、「方法 : Windows フォーム DataGridView コントロールの境界線とグリッド線のスタイルを変更する」を参照してください。
DataGridView コントロールへのユーザー入力の許可または制限。詳細については、「方法 : Windows フォーム DataGridView コントロールで行が追加および削除されないようにする」および「方法 : Windows フォームの DataGridView コントロールで列を読み取り専用にする」を参照してください。
ユーザー入力に対するデータベース関連エラーの検査。詳細については、「チュートリアル : Windows フォーム DataGridView コントロールでのデータ入力中に発生したエラーの処理」を参照してください。
仮想モードを使用した大量のデータの処理。詳細については、「チュートリアル : Windows フォーム DataGridView コントロールでの仮想モードの実装」を参照してください。
セルの表示形式のカスタマイズ。詳細については、「方法 : Windows フォームの DataGridView コントロールのセルの外観をカスタマイズする」および「方法 : Windows フォーム DataGridView コントロールのフォントと色のスタイルを設定する」を参照してください。
参照
処理手順
方法 : Windows フォーム DataGridView コントロールのデータを検証する
チュートリアル : Windows フォーム DataGridView コントロールでのデータ入力中に発生したエラーの処理