1

是否可以从同一个gridview中的另一个下拉列表选择索引更改方法更改gridview中下拉列表的数据源?

例如,我有一个下拉列表,需要根据在 gridview 的前一个单元格中选择的内容来更改其内容,这也是一个下拉列表。

任何帮助将非常感激

谢谢

4

3 回答 3

1

您可以在编辑第二个时设置第二个,而不是更改DataSource第一个更改的时间。DropDownList.SelectedIndexDataSourceDropDownList

可以在此处找到如何实现此目的的示例。

在本文中,作者挂钩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
于 2009-11-16T20:10:12.820 回答
0

这是我如何做到这一点的另一种方式,例如:两列(类型,天),如果用户下拉并选择“星期”,则第二个组合填充工作日,否则填充周末。

出于本示例的目的,添加一个包含两个 ComboBoxCell 列的网格 (DataGridView1),并让第一列包含以下项目:周、周末。

这个类将是我们的数据源:

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

此函数将根据键返回我们的数据源,键可以是 'week' 或 'weekend':

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

最后,当 Type 组合值更改时,将触发此事件,并将适当的数据源分配给我们的 days 组合:

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

请注意,此事件在单元格被验证后触发,即一旦您关闭单元格。

于 2009-11-25T14:15:46.187 回答
0

这是完全可能的。如何填充您的下拉列表?如果所有数据都是动态的,那么每次更改下拉列表选定项时都必须重建整个网格。

如果我没记错,您正在尝试应用过滤器机制。你是 ?我过去做过的另一种方法是从 GridView 的行中为 DropDownList 构建我的数据源。想想你已经在屏幕上拥有的数据。进入 PreRender 功能后,您可以在下拉列表中绑定所需的数据,这样您就可以减少负载。

于 2009-12-15T20:38:23.443 回答