0

ListBox 内のいくつかの項目を無効にする (灰色にする) 必要があったため、ここにあるカスタム コントロールを使用しています。

これが私の現在のコードです:

Private Sub MainForm_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        dtp.Columns.Add("key")
        dtp.Columns.Add("value")
        PopulateDataTable(dtp, "myTxt")

        _dataView = New DataView(dtp)

        'Custom ListBox
        List1.ValueMember = "key"
        List1.DisplayMember = "value"
        List1.DataSource = _dataView

        'Legacy ListBox
        List2.ValueMember = "key"
        List2.DisplayMember = "value"
        List2.DataSource = _dataView


        UpdateLanguageMenu()
    End Sub

    Private Function PopulateDataTable(dt As DataTable, resTxt As String)
        Using sw As New StringReader(My.Resources.ResourceManager.GetObject(resTxt))
            Do
                Dim line As String = sw.ReadLine
                If line Is Nothing OrElse line.Trim = String.Empty Then Exit Do
                Dim strArr() As String
                strArr = line.Split(",")

                Dim row As DataRow = dt.NewRow()
                row("key") = strArr(0)
                row("value") = strArr(1)
                dt.Rows.Add(row)
            Loop
            sw.Close()
        End Using
    End Function

List1は Custom ListBox でありList2、VS2012E に付属の ListBox です。

必要はありませんList2。テストするためだけにあり、実行時に、List2すべての値を正しくロードする代わりに、すべての行List1を取得System.Data.DataRowViewします..

奇妙なことは、私がロードしている私のtxtが次のようなものであることです:

00A1,MyValue1
00A2,Myvalue2
00A3,MyValue3

ラベルもあり、ListBox で項目を選択するときに、カンマの前の最初の部分に変更Label.Textするコードがあります。List.SelectedValue

そして、ラベルに表示されます。Custom ListBox 内のアイテムのみが表示されていません。

DataTableList1を使用する代わりに、手動で入力すると機能します。

そして私は初心者なので、問題を見つけることができません。

4

1 に答える 1

1

あなたの問題はこの行に関係していると思います:string displayValue = GetItemText(item); コントロールで。これは、すべてのアイテムが文字列であることを当然のことと考えています。あなたの場合、それはdatarowviewであるため、結果になります(drv.toStringはそのようなものを返します)。「item」をdrvに変換し、代わりに表示値をdrvItem(「value」または「key」)に設定する必要があります。したがって、問題となるのは基本的にコードではなく、コントロールです。

実際には...コードプロジェクトサイトではなく、コントロールでコードを読んだ後、私は次の行に気づきました。

displayValue = GetItemText(item); 

存在すらしていません。と交換されます

item.ToString()

これは私の理論をかなり証明しています。

そうです、修正方法。

の:

protected override void OnDrawItem(System.Windows.Forms.DrawItemEventArgs e)

あなたはこれを持っています:

object item = this.Items[e.Index];

あなたがしなければならないことは、アイテムをDataViewRowに変換し、次のような変数に値を割り当てることです。

DataViewRow dvrItem = (DataViewRow)item;
String displayText = dvrItem("key"); or String displayText = dvrItem("value");

次に、これらすべてを変更します。

e.Graphics.DrawString(item.ToString(), e.Font, SystemBrushes.GrayText, e.Bounds);

の中へ:

e.Graphics.DrawString(displayText, e.Font, SystemBrushes.GrayText, e.Bounds);
于 2012-11-13T07:17:01.097 に答える