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

Обратите внимание, что это событие возникает после проверки ячейки, т. Е. После того, как вы покинули ячейку.

Другие вопросы по тегам