Виртуальные режим в элементе управления DataRepeater (Visual Studio)
Если требуется отобразить большой объем табличных данных в элементе управления DataRepeater, можно улучшить производительность, установив свойство VirtualMode равным True, и явным образом управляя взаимодействием элемента управления с источником данных.Элемент управления DataRepeater предоставляет несколько событий, которые можно обрабатывать при взаимодействии с источником данных и при необходимости отображать с их помощью данные во время выполнения.
Как работает виртуальный режим
Наиболее распространенным сценарием для элемента управления DataRepeater является привязка дочерних элементов управления шаблона ItemTemplate к источнику данных на этапе разработки и разрешение BindingSource передавать данные в обе стороны при необходимости.При использовании виртуального режима элемент управления не привязывается к источнику данных и данные передаются в источник данных и обратно для привязки к источнику данных во время выполнения.
Если свойство VirtualMode установлено равным True, можно создать пользовательский интерфейс, добавив элементы управления из меню Панель элементов вместо того, чтобы добавлять связанные элементы управления из окна Источники данных.
События происходят для каждого отдельного элемента управления и необходимо добавить код для обработки вывода данных.Когда новый элемент DataRepeaterItem попадает в область просмотра, одновременно происходит событие ItemValueNeeded для каждого элемента управления, и необходимо предоставить значения для каждого элемента управления в обработчик событий ItemValueNeeded.
Если данные одного из элементов управления изменяются пользователем, вызывается событие ItemValuePushed и пользователю необходимо подтвердить данные для записи их в источник данных.
Если пользователь добавил новый элемент, вызывается событие NewItemNeeded.Используйте этот обработчик событий для создания новой записи в источнике данных.Чтобы предотвратить ненамеренное изменение, необходимо также проверить событие KeyDown для каждого элемента управления и вызвать CancelEdit, если пользователь нажмет ESC.
В случае изменения источника данных можно обновить элемент управления DataRepeater, вызвав методы BeginResetTemplateItem и EndResetTemplateItem.Оба метода должны быть вызваны в нужном порядке.
Наконец, следует реализовать обработчики событий для события ItemsRemoved, происходящего при удалении элемента и по возможности для событий UserDeletingItems и UserDeletedItems, происходящих при любом удалении элемента пользователем при помощи кнопки DELETE.
Реализация виртуального режима
Следуйте поэтапно шагам, необходимым для реализации виртуального режима.
Чтобы реализовать виртуальный режим
Перетащите элемент управления DataRepeater из вкладки Visual Basic PowerPacks в панели элементов на форму или контейнерный элемент управления.Установите для свойства VirtualMode значение True.
Перетащите элементы управления из панели элементов в область шаблона элементов (верхняя область) элемента управления DataRepeater.Для каждого в источнике данных, которое требуется отобразить, потребуется создать отдельный элемент управления.
Реализуйте обработчик события 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.Вызовите метод 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(); } }
Реализуйте обработчик события 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; } }
См. также
Ссылки
Основные понятия
Общие сведения об элементе управления DataRepeater (Visual Studio)