2009-11-16 4 views
1

Возможно ли изменить источник данных выпадающего списка в gridview из другого раскрывающегося списка выбранного метода с измененным индексом в том же gridview?Gridviews и DropdownLists

например, у меня есть раскрывающийся список, который должен изменить его содержимое в зависимости от того, что выбрано в предыдущей ячейке gridview, которое также является выпадающим списком.

Любая помощь будет высоко ценится

Благодаря

ответ

1

Вместо изменения DataSource, когда 1-й DropDownList.SelectedIndex изменения, вы можете установить DataSource 2-го DropDownList, когда оно редактируется.

Пример того, как это можно достичь, можно найти here.

В этой статье автор перехватывает событие 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 
0

Вот еще один способ, как я хотел бы сделать это, к примеру: две колонки (типы, дней), если пользователь падает вниз и «неделя» ВЫБИРАЕТ , вторая комбо заполняется в будние дни, иначе - выходные.

Для этого примера добавьте сетку (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 

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

0

Это вполне возможно. Как заполняют ваши dropdownlists? Если все данные являются динамическими, вам нужно будет перестроить всю сетку каждый раз, когда вы измените выбранный элемент выпадающего списка.

Если я не ошибаюсь, вы пытаетесь применить фильтр. Ты ? Еще один способ, который я делал в прошлом, - построить мой источник данных для DropDownList из строк GridView. Подумайте о данных, которые у вас уже есть на экране. После того, как вы находитесь в функции PreRender, вы можете связать необходимые данные в раскрывающемся списке, таким образом вы выберете нагрузку.