0

datagridviewcomboboxcolumnバインドされていない datagridview 内でを使用する場合、ケースに奇妙な問題があります。列には最初に有効な値が取り込まれます。その一部はすべて大文字で、一部は大文字と小文字が混在していますが、常に一意です。たとえば、「AB」、「AC」、「あいだ」、「AltCurr」、「BE」などです。

大文字の項目のいずれかを選択すると、すべて正常に機能します。ただし、セルのドロップダウンから大文字と小文字が混在する項目の 1 つを選択すると、「セルには無効なデータが含まれています」という DataError イベントが発行され、セルは「AB」を選択します (つまり、選択が見つからないため、デフォルトになります)。最初のエントリに)。

すべてのリスト項目を大文字に変更すると、問題は発生しません (ただし、これは実際にはオプションではありません!)。

BOUND datagridview コンボ列の大文字と小文字の区別に関する多くのコメントを読みました。解決策は、基になるデータテーブルの大文字と小文字の区別オプションを変更することですが、特定のバインドされていない問題を克服するものは何もありません。

他の誰かがこれに遭遇しましたか? もしそうなら、どのように修正しましたか?

編集: 要求されたコード サンプル...

Datagridviewcombobox 列は、デザイナーで既に作成されています (列 #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が使用するものの大文字と小文字の区別に違いがあります。

4

1 に答える 1

0

私は自分の質問に答えることができました。

コンボボックス列の 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 オブジェクトを使用してすべてのコンボボックス列項目を作成します。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 の内部動作は、すべて大文字でない限り、単純な文字列値のリストにバインドされていない状態で使用できないことを意味しているようです。表示される内容の大文字と小文字の区別を処理する方法と、基になるアイテムのコレクションを検索する方法には明らかな違いがあります。

これは私の生産的な時間のほぼ 1 日を無駄にしていますが、少なくとも次回はわかります。

いらいらする!

デレク

于 2012-09-18T11:13:22.117 に答える