Unbound Datagridviewcomboboxcolumn值是否区分大小写?

问题描述 投票:0回答:1

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

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

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

我在BOUND datagridview组合列中阅读了大量有关区分大小写的注释,解决方案是更改基础数据表上的区分大小写选项,但没有任何方法可以克服我的特定未绑定问题。

有没有人遇到过这个,如果有的话,你是怎么解决的?

编辑:按要求编码样本...

Datagridviewcomboboxcolumn已在设计器中创建(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 |显示。

如果我选择任何全部大写的列表项,则不会出现问题。在我看来,组合单元格没有在其对象集合中找到混合案例项 - 底层组合的对象集合的区分大小写和DGV用于检查集合中的有效性的区分大小写的区别。

winforms datagridview datagridviewcombobox
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

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

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

最后,在创建和填充行时,请确保将combocell值设置为基础数据的UPPERCASE值:

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的内部工作意味着你不能将它与未绑定的简单字符串值列表一起使用,除非它们都是大写的。与搜索其底层项目集合的方式相比,它在处理显示内容的区分大小写方面存在明显差异。

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

多么令人沮丧!

德里克

© www.soinside.com 2019 - 2024. All rights reserved.