问题描述
大家好,当我使用这个简单的代码时
Private Sub Button1_Click(ByVal sender As System.Object,ByVal e As System.EventArgs) 处理 Button1.点击
Dim cheq As New System.Text.StringBuilder
For Each item In CheckedListBox1.CheckedItems
cheq.Append(item)
cheq.Append(" ")
Next
MessageBox.Show(" Your Checked Items are : " & cheq.ToString())
End Sub
并等待我发现此结果的消息:“您检查的项目是:system.data.daTarowview”
有什么问题?
解决方法
代码没有问题,只是与您的期望不符。此 CheckedListBox 绑定到数据表。当控件绑定到数据表时,它实际上附加到了 DefaultView 属性公开的 DataView,而一个 DataView 是 DataRowView 的集合
大概您想访问底层 DataRow,可通过 DataRowView 的 Row 属性访问。这可能是不必要的;您可以像获取 DataRow 一样从 DataRowView 中获取值;如果您的 DataRow 代表一个带有 Name 列的人,那么其中任何一个都会为您提供姓名:
DirectCast(DirectCast(item,DataRowView)("Name"),String)
DirectCast(DirectCast(item,DataRowView).Row("Name"),String)
或者稍微整理一下:
For Each item In CheckedListBox1.CheckedItems.Cast(Of DataRowView)
cheq.Append(item("SOME_COLUMN_NAME_HERE"))
cheq.Append(" ")
Next
,
当你绑定一个 DataTable
时,数据来自它的 DefaultView
,它是一个 DataView
。 DataView
中的每一项都是一个 DataRowView
,并且与大多数类型一样,在一个类型上调用 ToString
只会返回类型名称。
您可能正在设置 DisplayMember
的 CheckedListBox
以指定应从 DataTable
的哪一列提取值以显示在控件中。如果您真正想要的是为项目显示的文本,那么您应该调用 GetItemText
方法:
Dim itemText = CheckedListBox1.CheckedItems.
Cast(Of Object).
Select(Function(o) CheckedListBox1.GetItemText(o))
MessageBox.Show("Checked Items: " & String.Join(",",itemText))