【问题标题】:DatagridviewComboBoxCell of datagridview not working as expecteddatagridview 的 DatagridviewComboBoxCell 未按预期工作
【发布时间】:2015-10-15 08:50:19
【问题描述】:

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

现在在加载网格时,我可以看到带有下拉列表的单元格和所有需要的项目。但是当我选择一个特定项目并移动到其他单元格时,这个ComboBoxcell 显示ValueMember 而不是DisplayMember

例如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

【问题讨论】:

  • 请与我们分享您的相关代码,以便我们为您提供帮助。
  • @equisde:代码已添加到问题正文中。
  • 我想代码是在加载你的 DataGrid 时执行的。如果是这样,您的代码中没有任何内容可能导致上述问题。确保您在 DataGridView.CellValueChangedDataGridView.CellEnter 事件中没有代码
  • @equisde:最初加载网格时,带有 ComboCell 的列保持空白。您可以稍后选择该项目。但是,当您选择该项目并按选项卡离开组合单元时,文本将变为相应的值。就像在我离开单元格时选择“一月”时,组合单元显示 1
  • 看我的回答。希望对你有帮助。

标签: c# vb.net datagridview


【解决方案1】:

该代码只是从数据库中检索月份名称和月份编号,并用它们填充 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

【讨论】:

  • 那么对不起。我误解了你对原帖的评论。然后你需要找到导致错误行为的代码。当单元格失去焦点时,您确定没有编码吗? DataGridView.CellValueChangedDataGridView.CellEnter 等是当您从组合单元格更改为另一个单元格时可能触发的事件
  • 数据库级别iMonth 列的DataGridView 数据源的类型是什么?也许当代码尝试创建DataTable 来填充DataGridView 组合框列时,iMonth 类型为Integer
  • 它是使用 ROW_NUMBER 函数自动生成的序列。必须是整数。你可以看到上面提到的代码中写的SQL
  • 我的意思是数据库列数据类型。如果是Integer,则数据表列类型为Integer,DataGridView 列为Integer,不允许该列包含其他数据类型值。这可能是原因。
  • 实际上不涉及数据库列。查询是:SELECT DateName(M,'1900-' + X.iMonth + '-01') sMonth, X.iMonth FROM (SELECT TOP 12 CONVERT(VARCHAR, ROW_NUMBER() OVER(ORDER BY name)) iMonth from sys.对象)X
猜你喜欢
  • 2021-06-04
  • 2022-01-24
  • 2015-05-11
  • 2020-05-15
  • 2014-10-31
  • 2018-02-12
  • 2014-01-20
  • 2015-01-13
  • 2013-08-01
相关资源
最近更新 更多