未绑定的 Datagridviewcomboboxcolumn 值是不是区分大小写?

Posted

技术标签:

【中文标题】未绑定的 Datagridviewcomboboxcolumn 值是不是区分大小写?【英文标题】:Are Unbound Datagridviewcomboboxcolumn values case-sensitive?未绑定的 Datagridviewcomboboxcolumn 值是否区分大小写? 【发布时间】:2012-09-17 17:12:02 【问题描述】:

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

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

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

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

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

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

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 用于检查集合内有效性的任何大小写敏感度存在差异。

【问题讨论】:

您能否展示一些数据示例和相应的代码?这将使人们更容易看到为什么会收到错误。 按要求添加代码示例 原始帖子的第一段中已经提供了相关数据的示例。 【参考方案1】:

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

似乎我关于组合框列的对象集合中区分大小写差异的理论(至少部分)是正确的。不要将字符串值添加到 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 的内部工作方式意味着您根本无法将其与简单字符串值列表一起使用,除非它们都是大写的。与搜索底层项目集合的方式相比,它处理显示内容的区分大小写的方式存在明显差异。

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

多么令人沮丧!

德里克

【讨论】:

以上是关于未绑定的 Datagridviewcomboboxcolumn 值是不是区分大小写?的主要内容,如果未能解决你的问题,请参考以下文章

将 DataGridViewComboBox 默认设置为等于现有 DataGridView 列

具有 Datagridviewcombobox 列的单元格显示 ValueMember 而不是 DisplayMember

DataGridViewComboBox 数据源

DataGridViewCombobox 列中的自动完成有啥奇怪的行为?

在 DataGridViewComboBox 下拉列表中设置特定项目的颜色

DataGridViewComboBox 索引更改事件故障