DataRepeater コントロールの仮想モード (Visual Studio)
大きな表形式のデータを DataRepeater コントロールに表示するときは、VirtualMode プロパティを True に設定してコントロールとデータ ソースのやり取りを明示的に管理することによって、パフォーマンスを向上させることができます。DataRepeater コントロールには、必要に応じてデータ ソースの操作とデータの表示を行うために実行時に処理できる複数のイベントがあります。
仮想モードの動作
DataRepeater コントロールを使用するうえで最も一般的なシナリオは、デザイン時に ItemTemplate の子コントロールをデータ ソースにバインドし、必要に応じて BindingSource でデータの受け渡しができるようにすることです。仮想モードを使用すると、コントロールはデータ ソースにバインドされず、データは実行時に基になるデータ ソースとの間で受け渡されます。
VirtualMode プロパティを True に設定する場合、[データ ソース] ウィンドウからバインド コントロールを追加する代わりに、ツールボックスからコントロールを追加してユーザー インターフェイスを作成します。
イベントはコントロール単位で発生するので、データの表示を処理するコードを追加する必要があります。新しい DataRepeaterItem をスクロールして表示すると、コントロールごとに ItemValueNeeded イベントが 1 回発生するので、ItemValueNeeded イベント ハンドラー内でコントロールごとの値を指定する必要があります。
1 つのコントロールのデータがユーザーによって変更されると、ItemValuePushed イベントが発生するので、そのデータを検証し、データ ソースに保存する必要があります。
ユーザーが新しい項目を追加すると、NewItemNeeded イベントが発生します。このイベントのハンドラーを使用して、データ ソースに新しいレコードを作成します。意図しない変更を防ぐために、コントロールごとに KeyDown イベントを監視して、ユーザーが Esc キーを押した場合には CancelEdit を呼び出すことも必要です。
データ ソースが変更された場合、BeginResetTemplateItem メソッドおよび EndResetTemplateItem メソッドを呼び出すことで、DataRepeater コントロールを更新できます。これらのメソッドは順番に呼び出す必要があります。
最後に、項目が削除されると発生する ItemsRemoved イベントのイベント ハンドラーを実装する必要があり、また、オプションで、ユーザーが Del キーを押して項目を削除するたびに発生する UserDeletingItems イベントおよび UserDeletedItems イベントのイベント ハンドラーも実装します。
仮想モードの実装
仮想モードの実装に必要な手順を次に示します。
仮想モードを実装するには
ツールボックスの [Visual Basic PowerPacks] タブから DataRepeater コントロールをフォームまたはコンテナー コントロールにドラッグします。VirtualMode プロパティを True に設定します。
ツールボックスからコントロールを DataRepeater コントロールの項目テンプレート領域 (上部の領域) にドラッグします。データ ソースから表示するフィールドごとに 1 つのコントロールが必要です。
ItemValueNeeded イベントのハンドラーを実装して、各コントロールに値を指定します。このイベントは、新しい DataRepeaterItem をスクロールして表示すると発生します。コードは、次のコード例のようになります。この例は Employees という名前のデータ ソースを使用します。
Private Sub DataRepeater1_ItemValueNeeded( ByVal sender As Object, ByVal e As Microsoft.VisualBasic.PowerPacks.DataRepeaterItemValueEventArgs ) Handles DataRepeater1.ItemValueNeeded If e.ItemIndex < Employees.Count Then Select Case e.Control.Name Case "txtFirstName" e.Value = Employees.Item(e.ItemIndex + 1).firstName Case "txtLastName" e.Value = Employees.Item(e.ItemIndex + 1).lastName End Select End If End Sub
private void dataRepeater1_ItemValueNeeded(object sender, Microsoft.VisualBasic.PowerPacks.DataRepeaterItemValueEventArgs e) { if (e.ItemIndex < Employees.Count) { switch (e.Control.Name) { case "txtFirstName": e.Value = Employees[e.ItemIndex + 1].firstName; break; case "txtLastName": e.Value = Employees[e.ItemIndex + 1].lastName; break; } } }
ItemValuePushed イベントのハンドラーを実装して、データを保存します。このイベントは、DataRepeaterItem の子コントロールへの変更をユーザーがコミットすると発生します。コードは、次のコード例のようになります。この例は Employees という名前のデータ ソースを使用します。
Private Sub DataRepeater1_ItemValuePushed( ByVal sender As Object, ByVal e As Microsoft.VisualBasic.PowerPacks.DataRepeaterItemValueEventArgs ) Handles DataRepeater1.ItemValuePushed Dim emp As Employee = Employees.Item(e.ItemIndex) Select Case e.Control.Name Case "txtFirstName" emp.firstName = e.Control.Text Case "txtLastName" emp.lastName = e.Control.Text Case Else MsgBox("Error during ItemValuePushed unexpected control: " & e.Control.Name) End Select End Sub
private void dataRepeater1_ItemValuePushed(object sender, Microsoft.VisualBasic.PowerPacks.DataRepeaterItemValueEventArgs e) { Employee emp = Employees[e.ItemIndex]; switch (e.Control.Name) { case "txtFirstName": emp.firstName = e.Control.Text; break; case "txtLastName": emp.lastName = e.Control.Text; break; default: MessageBox.Show("Error during ItemValuePushed unexpected control: " + e.Control.Name); break; } }
各コントロールの KeyDown イベントのハンドラーを実装して、Esc キーを監視します。ItemValuePushed イベントが発生しないようにするには、CancelEdit メソッドを呼び出します。コードは、次のコード例のようになります。
Private Sub Child_KeyDown( ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs ) Handles txtFirstName.KeyDown, txtLastName.KeyDown If e.KeyCode = Keys.Escape Then Datarepeater1.CancelEdit() End If End Sub
private void child_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) { if (e.KeyCode == Keys.Escape) { this.dataRepeater1.CancelEdit(); } }
NewItemNeeded イベントのハンドラーを実装します。このイベントは、ユーザーが DataRepeater コントロールに新しい項目を追加すると発生します。コードは、次のコード例のようになります。この例は Employees という名前のデータ ソースを使用します。
Private Sub DataRepeater1_NewItemNeeded( ) Handles DataRepeater1.NewItemNeeded Dim newEmployee As New Employee Employees.Add(newEmployee) blnNewItemNeedEventFired = True End Sub
private void dataRepeater1_NewItemNeeded(object sender, System.EventArgs e) { Employee newEmployee = new Employee(); Employees.Add(newEmployee); blnNewItemNeedEventFired = true; }
ItemsRemoved イベントのハンドラーを実装します。このイベントは、ユーザーが既存の項目を削除すると発生します。コードは、次のコード例のようになります。この例は Employees という名前のデータ ソースを使用します。
Private Sub DataRepeater1_ItemsRemoved( ByVal sender As Object, ByVal e As Microsoft.VisualBasic.PowerPacks.DataRepeaterAddRemoveItemsEventArgs ) Handles DataRepeater1.ItemsRemoved Employees.RemoveAt(e.ItemIndex) End Sub
private void dataRepeater1_ItemsRemoved(object sender, Microsoft.VisualBasic.PowerPacks.DataRepeaterAddRemoveItemsEventArgs e) { Employees.RemoveAt(e.ItemIndex); }
コントロール レベルの検証を行う場合、オプションで、子コントロールの Validating イベントのハンドラーを実装します。コードは、次のコード例のようになります。
Private Sub Text_Validating( ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs ) Handles txtFirstName.Validating, txtLastName.Validating If txtFirstName.Text = "" Then MsgBox("Please enter a name.") e.Cancel = True End If End Sub
private void Text_Validating(object sender, System.ComponentModel.CancelEventArgs e) { if (txtFirstName.Text == "") { MessageBox.Show("Please enter a name."); e.Cancel = true; } }