首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >VB.Net自定义ListBox输出问题

VB.Net自定义ListBox输出问题
EN

Stack Overflow用户
提问于 2012-11-13 03:38:49
回答 1查看 528关注 0票数 0

因为我需要禁用(灰显) ListBox中的一些项,所以我使用了一个可以在here中找到的自定义控件

下面是我当前的代码:

代码语言:javascript
复制
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是这样的:

代码语言:javascript
复制
00A1,MyValue1
00A2,Myvalue2
00A3,MyValue3

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

它会显示在标签中。只有自定义ListBox中的项目不会显示。

手动填充List1,而不是使用DataTable,是可行的。

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-11-13 15:17:01

我认为您的问题与以下代码行有关:控件中的string displayValue = GetItemText(item);。这理所当然地认为所有项都是字符串。在您的示例中,它是一个数据视图,因此是结果(drv.toString将返回类似的内容)。您需要将"item“转换为drv,并将display value设置为drvItem("value”或"key")。所以基本上不是你的代码有问题,而是控件有问题。

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

代码语言:javascript
复制
displayValue = GetItemText(item); 

根本就不存在。它被交换为

代码语言:javascript
复制
item.ToString()

这很好地证明了我的理论。

对,如何修复。

在:

代码语言:javascript
复制
protected override void OnDrawItem(System.Windows.Forms.DrawItemEventArgs e)

您拥有以下内容:

代码语言:javascript
复制
object item = this.Items[e.Index];

您需要做的是将item转换为DataViewRow,并为变量赋值,如下所示:

代码语言:javascript
复制
DataViewRow dvrItem = (DataViewRow)item;
String displayText = dvrItem("key"); or String displayText = dvrItem("value");

然后更改所有这些内容:

代码语言:javascript
复制
e.Graphics.DrawString(item.ToString(), e.Font, SystemBrushes.GrayText, e.Bounds);

进入:

代码语言:javascript
复制
e.Graphics.DrawString(displayText, e.Font, SystemBrushes.GrayText, e.Bounds);
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13350329

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档