【问题标题】:VB.Net DatagridviewComboBoxColumn CellClick behaviorVB.Net DatagridviewComboBoxColumn CellClick 行为
【发布时间】:2016-10-25 14:46:59
【问题描述】:

我有一个从 DataTable 填充的 DatagridviewComboBoxColumn,每当我单击 DataGridViewComboBoxCell 的任何部分时,列表的第一个值都会在单击时显示。但是,当我将焦点移动到另一个单元格而不选择值时,它会消失。

奇怪的是,如果我将 ComboBox 值与 .Items.Add(" ") 一起应用,则行为并不一致。任何人都可以对这个问题有所了解。 这是一个示例代码和一个 gif 图像:

Public Class Form1

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    DataGridView1.Rows.Add()
    DataGridView1.Rows.Add()

    ''DataGridViewComboBoxColumn1
    DataGridViewComboBoxColumn1.Items.Add("Name1")
    DataGridViewComboBoxColumn1.Items.Add("Name2")

    'DataGridViewComboBoxColumn2
    Dim dt As New DataTable
    dt.Columns.Add("id")
    dt.Columns.Add("name")
    dt.Rows.Add("1", "Name1")
    dt.Rows.Add("2", "Name2")
    With DataGridViewComboBoxColumn2
        .ValueMember = dt.Columns(0).ColumnName
        .DisplayMember = dt.Columns(1).ColumnName
        .DataSource = dt
    End With
End Sub

End Class

【问题讨论】:

  • 这听起来像是“通常”的行为。必须点击它。
  • ComboboxColumns 具有相同的设置,但以不同的方式填充。在显示下拉菜单之前,Column1 不会显示任何值。而通过 .DataSource 填充的 Column2 会在触发下拉菜单之前闪烁第一个值。正如我所说:它只会闪烁但不会选择它。
  • 我已经测试过了,它工作正常。但是您必须单击所需的项目,而不仅仅是“选择”它。这是用户问题,而不是不良行为。

标签: vb.net datagridviewcombobox datagridviewcomboboxcell


【解决方案1】:

成功复制了行为,但我还在同一个表单中添加了 2 个 ComboBox,结果是一样的

Public Class Form1

    Private Sub Form1_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
        DataGridView1.Rows.Add()
        DataGridView1.Rows.Add()

        ''DataGridViewComboBoxColumn1


        DataGridViewComboBoxColumn1.Items.Add("Name1")
        DataGridViewComboBoxColumn1.Items.Add("Name2")

        'DataGridViewComboBoxColumn2
        Dim dt As New DataTable
        dt.Columns.Add("id")
        dt.Columns.Add("name")
        dt.Rows.Add("1", "Name1")
        dt.Rows.Add("2", "Name2")
        With DataGridViewComboBoxColumn2
            .ValueMember = dt.Columns(0).ColumnName
            .DisplayMember = dt.Columns(1).ColumnName
            .DataSource = dt
        End With

        ComboBox1.Items.Add("Name1")
        ComboBox1.Items.Add("Name2")

        With ComboBox2
            .ValueMember = dt.Columns(0).ColumnName
            .DisplayMember = dt.Columns(1).ColumnName
            .DataSource = dt
        End With

    End Sub
End Class

Click to see gif of form in action

【讨论】:

  • 如您所见,Name1 出现在 Column2 中,而您没有实际选择它,而在 Column1 的情况下,它保持空白。我的问题是如何在使用数据源时具有与 Column1 中相同的行为,因为它可能会使用户感到困惑。
【解决方案2】:

我通过参考这篇文章找到了一种纠正行为的方法: DataGridComboBoxColumn shows first value on CellEnter

这是我使用的代码:

    Private Sub DataGridView1_EditingControlShowing(ByVal sender As Object, ByVal e As DataGridViewEditingControlShowingEventArgs) Handles DataGridView1.EditingControlShowing
      If TypeOf e.Control Is ComboBox Then
          Dim comboBox As ComboBox = DirectCast(e.Control, ComboBox)
          If DataGridView1.CurrentCell.Value Is Nothing Then comboBox.SelectedIndex = -1
      End If
    End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多