0

datagridviewcomboboxcolumn在未绑定的datagridview中使用a时,我遇到了一个奇怪的问题。该列最初填充了有效值,其中一些全为大写,一些混合大小写,但始终是唯一的。例如,“AB”、“AC”、“AiDA”、“AltCurr”、“BE”等。

选择任何大写项目时,一切正常。但是,如果我从单元格的下拉列表中选择一个大小写混合的项目,则会发出“单元格包含无效数据”DataError 事件,并且单元格选择“AB”(即无法找到选择,因此默认为到第一个条目)。

如果我将所有列表项都更改为大写,则不会出现问题(但实际上这不是一个选项!)。

我已经阅读了大量关于 BOUND datagridview 组合列中区分大小写的评论,解决方案是更改底层数据表上的区分大小写选项,但没有什么可以克服我的特定未绑定问题。

有没有其他人遇到过这个问题,如果有,你是如何解决的?

编辑:按要求编写代码示例...

Datagridviewcombobox 列已经在设计器中创建(col #2)。它从对象集合中填充如下:

m_subjectList = new SubjectList  
for each sj as Subject in m_subjectlist  
    ctype(dgv.columns(2),datagridviewcomboboxcolumn).items.add(sj.SubjectCode) 'a string value  
next

行是从基础数据表中手动添加的:

for each dr as datarow in ds.tables("Mappings").rows
    dim r as integer = dgv.rows.add
    dgv.rows(r).cells(2).value = dr("SubjectCode") 'varchar(10)
next

到目前为止一切正常 - DGV 正确显示,单元格组合中的值全部正确。不再需要代码。

现在,如果我单击任何这些行上的下拉菜单来更改主题,除非我选择“AiDA”或“AltCurr”项目(即混合大小写的项目),否则一切正常。dataerror 上下文是 Formatting | 展示。

如果我选择任何全部大写的列表项,则不会出现问题。在我看来,组合单元格在其 objectcollection 中没有找到混合大小写项目 - 底层组合对象集合的大小写敏感性与 DGV 用于检查集合内有效性的任何大小写敏感性存在差异。

4

1 回答 1

0

我设法回答了我自己的问题。

似乎我关于组合框列的对象集合中区分大小写差异的理论(至少部分)是正确的。不要将字符串值添加到 Items 集合,而是使用包含字符串的原始和大写版本的自定义对象。

这现在有效:

Public Class ComboCellItem
    Private m_Value As String
    Private m_Description As String

    Public ReadOnly Property Value() As String
        Get
            Return m_Value
        End Get
    End Property

    Public ReadOnly Property Description() As String
        Get
            Return m_Description
        End Get
    End Property

   Public Sub New(ByVal Value As String, ByVal Description As String)
        m_Value = Value
        m_Description = Description
    End Sub
End Class

现在使用 ComboCellItem 对象创建所有组合框列项。请注意,ComboCellItem 对象的两个属性都是相同的,除了一个以大写形式存储:

m_SubjectList = New SubjectList(m_dbc)
For Each sj As Subject In m_SubjectList
    Dim r As Integer = .Rows.Add
    CType(dgvMap.Columns(2), DataGridViewComboBoxColumn).Items.Add _
                (New ComboCellItem(sj.SubjectCode.ToUpper, sj.SubjectCode))
Next

将组合列的 Displaymember 设置为原始(非大写)值,将 Valuemember 设置为大写元素:

CType(dgvMap.Columns(2), DataGridViewComboBoxColumn).DisplayMember = "Description"
CType(dgvMap.Columns(2), DataGridViewComboBoxColumn).ValueMember = "Value"

最后,在创建和填充行时,确保将组合单元格值设置为基础数据的大写值:

For Each dr As DataRow In ds.tables("Mappings").Rows
    Dim r As Integer = dgvMap.Rows.Add
    dgvMap.Rows(r).Cells(2).Value = dr("SubjectCode").ToString.ToUpper
Next

现在,当您从下拉列表中选择大小写混合项目时,一切都按预期工作。似乎 DatagridviewComboboxColumn 的内部工作方式意味着您根本无法将它与简单字符串值列表一起使用,除非它们都是大写的。与搜索其底层项目集合的方式相比,它处理显示内容的区分大小写的方式存在明显差异。

这几乎浪费了我一天的工作时间,但至少我下次会知道。

多么令人沮丧!

德里克

于 2012-09-18T11:13:22.117 回答