Поделиться через


Виртуальные режим в элементе управления DataRepeater (Visual Studio)

Обновлен: Июль 2008

Если требуется отобразить большой объем табличных данных в элементе управления DataRepeater, можно улучшить производительность, установив свойство VirtualMode равным True, и явным образом управляя взаимодействием элемента управления с источником данных. Элемент управления DataRepeater предоставляет несколько событий, которые можно обрабатывать при взаимодействии с источником данных и при необходимости отображать с их помощью данные во время выполнения.

Как работает виртуальный режим

Наиболее распространенным сценарием для элемента управления DataRepeater является привязка дочерних элементов управления шаблона ItemTemplate к источнику данных на этапе разработки и разрешение BindingSource передавать данные в обе стороны при необходимости. При использовании виртуального режима элемент управления не привязывается к источнику данных и данные передаются в источник данных и обратно для привязки к источнику данных во время выполнения.

Если свойство VirtualMode установлено равным True, можно создать пользовательский интерфейс, добавив элементы управления из меню Панель элементов вместо того, чтобы добавлять связанные элементы управления из окна Источники данных.

События происходят для каждого отдельного элемента управления и необходимо добавить код для обработки вывода данных. Когда новый элемент DataRepeaterItem попадает в область просмотра, одновременно происходит событие ItemValueNeeded для каждого элемента управления, и необходимо предоставить значения для каждого элемента управления в обработчик событий ItemValueNeeded.

Если данные одного из элементов управления изменяются пользователем, вызывается событие ItemValuePushed и пользователю необходимо подтвердить данные для записи их в источник данных.

Если пользователь добавил новый элемент, вызывается событие NewItemNeeded. Используйте этот обработчик событий для создания новой записи в источнике данных. Чтобы предотвратить ненамеренное изменение, необходимо также проверить событие KeyDown для каждого элемента управления и вызвать CancelEdit, если пользователь нажмет ESC.

Наконец, следует реализовать обработчики событий для события ItemsRemoved, происходящего при удалении элемента и по возможности для событий UserDeletingItems и UserDeletedItems, происходящих при любом удалении элемента пользователем при помощи кнопки DELETE.

Реализация виртуального режима

Следуйте поэтапно шагам, необходимым для реализации виртуального режима.

Чтобы реализовать виртуальный режим

  1. Перетащите элемент управления DataRepeater из вкладки Visual Basic PowerPacks в Панели элементов на форму или контейнерный элемент управления. Установите для свойства VirtualMode значение True.

  2. Перетащите элементы управления из панели элементов в область шаблона элементов (верхняя область) элемента управления DataRepeater. Для каждого в источнике данных, которое требуется отобразить, потребуется создать отдельный элемент управления.

  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. Вызовите метод CancelEdit для предотвращения возникновения события ItemValuePushed. Код будет аналогичен коду, который приведен в следующем примере.

    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

Добавлен раздел.

Изменение функции SP1.