datagridviewComboBoxCell的datagridview无法按预期工作

时间:2015-10-15 08:50:20

标签: c# vb.net datagridview

我有一个datagridview,其中一个单元格的类型为DatagridviewComboBoxCell。对于此单元格,我将数据源与其关联,并提及DisplayMemberValueMember属性。

现在加载网格时,我能够看到带有下拉列表的单元格以及所有需要的项目。但是,当我选择特定项目并移至其他单元格时,此ComboBoxcell会显示ValueMember而不是DisplayMember

E.g。 Combobox在其中列出了几个月,如January, February...December。因此,DisplayMember为January,February...DecemberValueMember为月份编号,如1,2,3...12。因此,当我选择说January并移至任何其他单元格时,ComboBoxCell会在1的情况下显示月份数,即January

我希望单元格在通用术语中显示JanuaryDisplayMember而不是ValueMember

请让我知道如何实现这一目标。请注意,我不想将整个列用作DataGridViewComboBoxColumn

以下是代码:

Using Conn = New SqlConnection(ConnString)
            dt = New DataTable
            Dim da As New SqlDataAdapter("SELECT DateName(M,'1900-' + CONVERT(VARCHAR, X.iMonth) + '-01') sMonth, X.iMonth " & _
                                         " FROM (SELECT TOP 12 ROW_NUMBER() OVER(ORDER BY name) iMonth from sys.objects) X", Conn)
            da.Fill(dt)
        End Using

        For Each dr As DataGridViewRow In DataGridView1.Rows
            Dim ComboCell As New DataGridViewComboBoxCell

            DataGridView1("sNotes", dr.Index) = ComboCell
            ComboCell.DataSource = dt
            ComboCell.DisplayMember = "sMonth"
            ComboCell.ValueMember = "iMonth"
        Next

1 个答案:

答案 0 :(得分:0)

该代码只是从数据库中检索月份名称和月份编号,并用它们填充ComboCells。每次离开ComboCell时都会执行它是没有意义的。尝试仅在Load事件期间执行该操作。

请注意,代码是动态编写的,未经过测试。

Private Sub Form1_Load(ByVal sender As Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load

[...]

Using Conn = New SqlConnection(ConnString)
            dt = New DataTable
            Dim da As New SqlDataAdapter("SELECT DateName(M,'1900-' + CONVERT(VARCHAR, X.iMonth) + '-01') sMonth, X.iMonth " & _
                                         " FROM (SELECT TOP 12 ROW_NUMBER() OVER(ORDER BY name) iMonth from sys.objects) X", Conn)
            da.Fill(dt)
        End Using

        For Each dr As DataGridViewRow In DataGridView1.Rows
            Dim ComboCell As New DataGridViewComboBoxCell

            DataGridView1("sNotes", dr.Index) = ComboCell
            ComboCell.DataSource = dt
            ComboCell.DisplayMember = "sMonth"
            ComboCell.ValueMember = "iMonth"
        Next

[...]

End Sub

要检索月份编号(ValueMember),请不要担心,当您从显示的月份名称(DisplayMember)中选择一个月时,它将在内部被选中

您唯一需要的是遍历所有ComboCell并检索其选定的值。

    Dim monthValues as Integer()
    Dim i As Integer = 0
    For Each dr As DataGridViewRow In DataGridView1.Rows
         monthValues(i) = dr.Cells("sNotes").SelectedValue;
         i += 1
    Next