チュートリアル: Windows フォーム DataGridView コントロールのデータの妥当性検査
データ入力機能をユーザーに表示する場合は、フォームに入力されたデータを検証する必要が頻繁に生じます。 DataGridView クラスでは、データがデータ ストアにコミットされる前に検証を実行するための、便利な方法が提供されています。 開発者は、現在のセルが変更されたときに DataGridView によって発生する CellValidating イベントを処理することで、データを検証できます。
このチュートリアルでは、Northwind サンプル データベースの Customers
テーブルから行を取得し、それらを DataGridView コントロールに表示します。 ユーザーが CompanyName
列のセルを編集し、そのセルから移動しようとすると、CellValidating イベント ハンドラーによって新しい会社名の文字列がチェックされ、値が空でないかどうかが確認されます。新しい値が空の文字列である場合、DataGridView では、空でない文字列が入力されるまで、ユーザーのカーソルをセルから移動できなくなります。
このトピックのコードを単一のリストとしてコピーする方法については、「方法: 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); 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
データベースへの接続の詳細を処理できるようにするために、フォームのクラス定義にメソッドを実装します。
このコード例では、データが設定された 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
DataGridView と BindingSource を初期化し、データ バインディングを設定する、フォームの 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
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 コントロールの外観と動作は、次に示すいくつかの方法でカスタマイズできます。
境界線とヘッダーのスタイルを変更する。 詳細については、「方法: Windows フォーム DataGridView コントロールの境界線とグリッド線のスタイルを変更する」を参照してください。
DataGridView コントロールへのユーザー入力を有効化または制限する。 詳細については、「方法: Windows フォーム DataGridView コントロールで行が追加および削除されないようにする」および「方法: Windows フォームの DataGridView コントロールで列を読み取り専用にする」を参照してください。
ユーザー入力をチェックして、データベース関連のエラーがないかどうかを確認する。 詳細については、「チュートリアル: Windows フォーム DataGridView コントロールでのデータ入力中に発生したエラーの処理」を参照してください。
仮想モードを使用して、非常に大きなデータ セットを処理する。 詳細については、「チュートリアル: Windows フォーム DataGridView コントロールでの仮想モードの実装」を参照してください。
セルの外観をカスタマイズする。 詳細については、「方法: Windows フォームの DataGridView コントロールのセルの外観をカスタマイズする」および「方法: Windows フォーム DataGridView コントロールのフォントと色のスタイルを設定する」を参照してください。
関連項目
.NET Desktop feedback