因为我需要禁用(灰显) 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 FunctionList1是自定义ListBox,List2是VS2012E附带的ListBox。
我不需要List2,它只是用来测试的,而且在运行时,在List2中,我会正确加载所有值,而在List1中,我会在所有行中获取System.Data.DataRowView。
奇怪的是,我加载的txt是这样的:
00A1,MyValue1
00A2,Myvalue2
00A3,MyValue3我也有一个标签,当在ListBox上选择项目时,我有代码将Label.Text更改为List.SelectedValue,这是逗号之前的第一部分。
它会显示在标签中。只有自定义ListBox中的项目不会显示。
手动填充List1,而不是使用DataTable,是可行的。
由于我是初学者,我找不到问题所在。
发布于 2012-11-13 15:17:01
我认为您的问题与以下代码行有关:控件中的string displayValue = GetItemText(item);。这理所当然地认为所有项都是字符串。在您的示例中,它是一个数据视图,因此是结果(drv.toString将返回类似的内容)。您需要将"item“转换为drv,并将display value设置为drvItem("value”或"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);https://stackoverflow.com/questions/13350329
复制相似问题