Share via


DataRepeater コントロールの仮想モード (Visual Studio)

更新 : 2008 年 7 月

大きな表形式のデータを DataRepeater コントロールに表示するときは、VirtualMode プロパティを True に設定してコントロールとデータ ソースのやり取りを明示的に管理することによって、パフォーマンスを向上させることができます。DataRepeater コントロールには、必要に応じてデータ ソースの操作とデータの表示を行うために実行時に処理できる複数のイベントがあります。

仮想モードの動作

DataRepeater コントロールを使用するうえで最も一般的なシナリオは、デザイン時に ItemTemplate の子コントロールをデータ ソースにバインドし、必要に応じて BindingSource でデータの受け渡しができるようにすることです。仮想モードを使用すると、コントロールはデータ ソースにバインドされず、データは実行時に基になるデータ ソースとの間で受け渡されます。

VirtualMode プロパティを True に設定する場合、[データ ソース] ウィンドウからバインド コントロールを追加する代わりに、ツールボックスからコントロールを追加してユーザー インターフェイスを作成します。

イベントはコントロール単位で発生するので、データの表示を処理するコードを追加する必要があります。新しい DataRepeaterItem をスクロールして表示すると、コントロールごとに ItemValueNeeded イベントが 1 回発生するので、ItemValueNeeded イベント ハンドラ内でコントロールごとの値を指定する必要があります。

1 つのコントロールのデータがユーザーによって変更されると、ItemValuePushed イベントが発生するので、そのデータを検証し、データ ソースに保存する必要があります。

ユーザーが新しい項目を追加すると、NewItemNeeded イベントが発生します。このイベントのハンドラを使用して、データ ソースに新しいレコードを作成します。意図しない変更を防ぐために、コントロールごとに KeyDown イベントを監視して、ユーザーが Esc キーを押した場合には CancelEdit を呼び出すことも必要です。

最後に、項目が削除されると発生する ItemsRemoved イベントのイベント ハンドラを実装する必要があり、また、オプションで、ユーザーが Del キーを押して項目を削除するたびに発生する UserDeletingItems イベントおよび UserDeletedItems イベントのイベント ハンドラも実装します。

仮想モードの実装

仮想モードの実装に必要な手順を次に示します。

仮想モードを実装するには

  1. ツールボックスの [Visual Basic PowerPacks] タブから DataRepeater コントロールをフォームまたはコンテナ コントロールにドラッグします。VirtualMode プロパティを True に設定します。

  2. ツールボックスからコントロールを DataRepeater コントロールの項目テンプレート領域 (上部の領域) にドラッグします。データ ソースから表示するフィールドごとに 1 つのコントロールが必要です。

  3. 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;
            }
        }
    }
    
  4. 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;
        }
    }
    
  5. 各コントロールの 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();
        }
    }
    
  6. NewItemNeeded イベントのハンドラを実装します。このイベントは、ユーザーが DataRepeater コントロールに新しい項目を追加すると発生します。コードは、次のコード例のようになります。この例は Employees という名前のデータ ソースを使用します。

    Private Sub DataRepeater1_NewItemNeeded(ByVal sender As Object, _
     ByVal e As System.EventArgs) 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;
    }
    
  7. 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);
    }
    
  8. コントロール レベルの検証を行う場合、オプションで、子コントロールの 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;
        }
    }
    

参照

概念

DataRepeater コントロールの概要 (Visual Studio)

参照

ItemValuePushed

NewItemNeeded

ItemValueNeeded

変更履歴

日付

履歴

理由

2008 年 7 月

トピックを追加

SP1 機能変更