【问题标题】:VB.Net Custom ListBox output issueVB.Net 自定义列表框输出问题
【发布时间】:2012-11-12 19:38:49
【问题描述】:

由于我需要禁用(灰显)ListBox 中的某些项目,我正在使用可以在here 找到的自定义控件:

这是我当前的代码:

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是自定义ListBox,List2是VS2012E自带的ListBox。

我不需要List2,它只是用来测试的, 在运行时,在List2 中,我正确加载了所有值,而不是在List1 中,我在所有行中都获得了System.Data.DataRowView ..

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

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

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

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

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

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

【问题讨论】:

    标签: vb.net listbox custom-controls


    【解决方案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);
    

    【讨论】:

    • 感谢您的回复。在搜索时,我找到了开发者网站,他说问题出在那条线上。我搜索了它,但找不到它。我需要改变什么才能让它工作?谢谢
    • 为您编辑。可能不是 100%,但它至少会帮助你。
    • 请记住,此解决方案不是全局修复,它与您的使用方式非常相关。
    猜你喜欢
    • 1970-01-01
    • 2014-10-18
    • 2018-04-15
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-26
    • 1970-01-01
    相关资源
    最近更新 更多