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正确加载了所有值,而不是在所有行中。List1System.Data.DataRowView

奇怪的是,我正在加载的 txt 是这样的:

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

我还有一个标签,当在 ListBox 上选择项目时,我有代码将其更改Label.TextList.SelectedValue逗号之前的第一部分。

它会显示在标签中。只有自定义列表框内的项目不被显示。

手动填充List1,而不是使用 DataTable,正在工作。

而且由于我是初学者,我无法找到问题所在。

4

1 回答 1

1

我认为您的问题与这一行有关: string displayValue = GetItemText(item); 在控制中。这理所当然地认为所有项目都是字符串。在您的情况下,它是一个 datarowview,因此是结果(drv.toString 会返回类似的东西)。您需要将 "item" 转换为 drv 并将显示值设置为 drvItem("value" or "key") 。所以基本上问题不是你的代码,而是控制。

其实...在阅读控件中的代码而不是代码项目站点上的代码后,我意识到这一行:

displayValue = GetItemText(item); 

甚至不存在。它与

item.ToString()

这几乎证明了我的理论。

对了,怎么修。

在:

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

你有这个:

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

您要做的是将 item 转换为 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 回答