2012-09-17 26 views
0

我在使用未綁定的datagridview中的datagridviewcomboboxcolumn時遇到了一個奇怪的問題。該列最初使用有效值填充,其中一些全部是大寫字母和一些混合大小寫,但始終是唯一的。例如,「AB」,「AC」,「AiDA」,「AltCurr」,「BE」等未綁定Datagridviewcomboboxcolumn值是否區分大小寫?

當選擇任何大寫字母項目時,一切正常,但如果選擇其中一種混合 - 單元格中的下拉式項目,「單元格包含無效數據」DataError事件發出,並且單元格選擇「AB」(即無法找到選擇,因此它默認爲第一個條目)

如果我將所有列表項目都更改爲大寫,則問題不會發生(但實際上這不是一個選項!)。

我已閱讀了大量有關BOUND datagridview組合列中的區分大小寫的評論,並提供瞭解決方案正在改變底層dat上的大小寫敏感選項可以的,但沒有任何東西能夠克服我的具體無約束的問題。

有沒有人遇到過這個,如果是的話,你是如何修復它的?

編輯:代碼示例的要求...

的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'項目(即混合大小寫),否則它一切正常。數據錯誤上下文是Formatting |顯示。

如果我選擇全部爲大寫的任何列表項,則不會出現該問題。在我看來,組合單元格在其對象集合中找不到混合大小寫項目 - 底層組合對象集合的區分大小寫以及DGV用來檢查集合內的有效性的大小寫敏感性存在差異。

+0

你能展示一些你的數據和適當的代碼的例子嗎?這會讓人們更容易明白爲什麼會收到錯誤。 –

+0

按請求添加的代碼示例 – Derek

+0

有關數據的示例已在原始文章的第一段中提供。 – Derek

回答

0

我已經設法回答我自己的問題。

看來,我關於comboboxcolumn的objectcollection中區分大小寫差異的理論(至少部分)是正確的。而不是將字符串值添加到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對象的所有comboboxcolumn項目。請注意,不同的是一個存儲大寫的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值設置爲基礎數據的大寫值:

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的內部工作原理意味着你不能用簡單的字符串值列表解除綁定,除非它們都是大寫的。與它如何搜索其基礎項目集相比,它在處理大小寫區分大小寫方面存在明顯差異。

這幾乎浪費了我生產時間的一天,但至少我會知道下一次。

多麼令人沮喪!

Derek