为什么 DataGridViewComboBoxColumn 显示 ValueMember 值?

4

我有一个小问题。 DataGridViewComboBoxColumn 显示的值来自于 ValueMember 而不是 DisplayMember。这个网格正常工作,当我从这一列中选择一些内容时,我看到了 DisplayMember 的值,但是当焦点丢失时,网格会显示一个 ValueMember。我有以下代码组合框列:

statusCBoxColumn.DataSource = dt 'datatable with two fields StatusId and StatusText
statusCBoxColumn.DisplayMember = "StatusText" 'is type NVarchar
statusCBoxColumn.ValueMember = "StatusId" 'is type Int

有人可以帮我吗?


编辑:我用以下方法解决了这个问题:

Private Sub dgv_CellFormatting(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles dgv.CellFormatting
  If (dgv.Columns(e.ColumnIndex).Name = "statusCBoxColumn") Then
    If e.Value & "" > "" Then
      Dim s1 As String = e.Value
      e.Value = GetData("Select StatusText from Status where ID = " & e.Value).ToString()
    End If
  End If
End Sub

但我认为这并不是最佳解决方案...

5个回答

1
我知道这是一个10年前的问题,但我遇到了同样的问题,并发现根据MSDN的说法:

当DataSource属性设置为字符串数组时,不需要设置ValueMember属性,因为数组中的每个字符串将被用作有效的显示字符串和有效的基础值。


1

我曾经遇到过同样的问题。 对于我来说,“statusID”是长整型。 我使用了system.type.gettype("System.Int64")解决了这个问题。 但结果还是一样的。 当我将其更改为Int32时,问题得到了解决。

所以,这是valuemember类型和datagridview类型之间的不匹配造成的。


1
你设置了组合框列的数据属性名称并将该列添加到数据网格视图中吗?你需要写:
    statusCBoxColumn.DataPropertyName = "StatusId";

并添加类似的列

    datagridview1.Columns.Add(statusCBoxColumn);

是的,DataPropertyName已设置并且该列已添加到DataGridView。DataGridView工作正常,我可以更改此列的值,但是当我从此网格中更改焦点时,ComboBoxColumn中显示的是ValueMember而不是DisplayMember。 - wertyk

0

e.Value = GetData("Select to_char(StatusId) , StatusText from Status where ID = " & e.Value).ToString()


1
嗨@skorec1,欢迎来到SO!你能再解释一下吗?这解决了什么问题?问题是什么?只需要更多的细节。此外,请将其放在代码块中(“{}”按钮),以便更容易阅读。 - Dylan Corriveau

0

试试这个,我之前也遇到了显示值成员的问题,希望它能解决。

    For index = 0 To cbo.Items.Count - 1
        cbo.SelectedIndex = index 
        MessageBox.Show(CType(cbo.SelectedValue, String))
    Next

我所使用的是:

    Dim jm As Integer
    jm = CType(cmbCategory.SelectedValue, String)
    MsgBox(jm)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接