Gridviews и DropdownLists
Можно ли изменить источник данных выпадающего списка в виде сетки из другого выпадающего списка, выбранного метода изменения индекса в том же виде сетки?
например, у меня есть выпадающий список, который должен изменить свое содержимое в зависимости от того, что выбрано в предыдущей ячейке таблицы, которая также является выпадающим списком.
Любая помощь приветствуется
Спасибо
3 ответа
Вместо изменения DataSource
когда 1-й DropDownList.SelectedIndex
изменения, вы можете установить DataSource
2-го DropDownList
когда это редактируется.
Пример того, как этого можно достичь, можно найти здесь.
В этой статье автор цепляет EditingControlShowing
событие для того, чтобы изменить тип ComboBox
, Это можно легко изменить, чтобы изменить DataSource
вместо:
Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
' make sure we are editing the 2nd ComboBox:'
Dim comboBoxColumn2 As DataGridViewComboBoxColumn = DataGridView1.Columns(2)
If (DataGridView1.CurrentCellAddress.X = comboBoxColumn2.DisplayIndex) Then
'here you retrieve the value of the 1st ComboBox:'
Dim comboBox1Value As object = DataGridView1.SelectedRow... 'fill with whatever is needed'
Dim cb As ComboBox = e.Control
If (cb IsNot Nothing) Then
cb.DataSource = Nothing 'maybe not needed, I'm not sure
cb.DataSource = 'here, set the data source based on the value of ComboBox1'
End If
End If
End Sub
Это вполне возможно. Как заполняются ваши выпадающие списки? Если все данные являются динамическими, вам придется перестраивать всю сетку каждый раз, когда вы изменяете выбранный элемент в раскрывающемся списке.
Если я не ошибаюсь, вы пытаетесь применить механизм фильтра. Ты? Еще один способ, который я сделал в прошлом, - это построить мой источник данных для DropDownList из строк GridView. Подумайте о данных, которые у вас уже есть на экране. Как только вы попадаете в PreRender Function, вы можете связать необходимые данные в выпадающем списке, таким образом вы отключите нагрузку.
Вот другой способ, как я мог бы сделать это, например: Два столбца (Типы, Дни), если пользователь выпадает из списка и выбирает "неделя", вторая комбо заполняется днями недели, в противном случае - выходными.
В этом примере добавьте сетку (DataGridView1) с двумя столбцами ComboBoxCell и пусть первый столбец будет содержать следующие элементы: неделя, выходные.
Этот класс будет нашим источником данных:
Class WeekDataItem
Sub New(ByVal id As Integer, ByVal name As String)
Me.ID = id
Me.Name = name
End Sub
Public Property ID() As Integer
Get
Return _ID
End Get
Set(ByVal value As Integer)
_ID = value
End Set
End Property
Private _ID As Integer
Public Property Name() As String
Get
Return _Name
End Get
Set(ByVal value As String)
_Name = value
End Set
End Property
Private _Name As String
End Class
Эта функция возвращает наш источник данных, основываясь на ключе, который может быть "неделя" или "выходные":
Function getWeekDataSource(ByVal key As String) As List(Of WeekDataItem)
getWeekDataSource = New List(Of WeekDataItem)
If (key = "week") Then
getWeekDataSource.Add(New WeekDataItem(1, "monday"))
getWeekDataSource.Add(New WeekDataItem(2, "tuesday"))
getWeekDataSource.Add(New WeekDataItem(3, "wednesday"))
getWeekDataSource.Add(New WeekDataItem(4, "thrusday"))
getWeekDataSource.Add(New WeekDataItem(5, "friday"))
ElseIf (key = "weekend") Then
getWeekDataSource.Add(New WeekDataItem(6, "caturday"))
getWeekDataSource.Add(New WeekDataItem(7, "sunday"))
End If
End Function
И, наконец, это событие сработает при изменении значения поля "Тип" и назначит соответствующий источник данных нашему списку дней:
Private Sub DataGridView1_CellValueChanged(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles DataGridView1.CellValueChanged
' if the type dropdown value changed
If (e.ColumnIndex = clmTypes.Index) Then
' set the week dropdown data source for the current row
If Not IsNothing(DataGridView1.CurrentRow) Then
' get the combobox cell we want to change
Dim comboCell As DataGridViewComboBoxCell
comboCell = CType(DataGridView1.CurrentRow.Cells(clmDays.Index), DataGridViewComboBoxCell)
' assign it's new data source
comboCell.DataSource = getWeekDataSource(CStr(DataGridView1.Rows(e.RowIndex).Cells(e.ColumnIndex).Value))
' update the data source members so it displays info properly
comboCell.DisplayMember = "Name"
comboCell.ValueMember = "ID"
End If
End If
End Sub
Обратите внимание, что это событие возникает после проверки ячейки, т. Е. После того, как вы покинули ячейку.