1

经过几个小时的尝试,我能够得到一个绑定到 SQL 源的检查列表。但是,现在我想检索检查列表中已检查的所有项目。我尝试了上面的代码,但它不起作用

 For i As Integer = 0 To checkList_Facility.Items.Count - 1
        If (checkList_Facility.GetItemChecked(i)) = True Then
            MsgBox(checkList_Facility.Items(i))
        End If
    Next

绑定代码:

            Dim queryString As String = "SELECT Facility FROM Database.dbo.Facility"
        Dim connection As New SqlConnection(connectionString)
        Dim command As New SqlCommand(queryString, connection)
        connection.Open()
        Dim dataReader As SqlDataReader = command.ExecuteReader()
        Dim var As New DataTable
        Dim source As New BindingSource
        source.DataSource = dataReader
        CheckList_Facility.DataSource = source
        CheckList_Facility.ValueMember = "Facility"
        connection.Close()
4

2 回答 2

2

如何使用CheckedItems集合代替?

编辑:

dim itemChecked as Object
For Each itemChecked In checkList_Facility.CheckedItems
   MsgBox(itemChecked.ToString())
Next
于 2013-07-09T20:16:28.073 回答
1

CheckedItems似乎是一个不错的选择。下面是它的工作原理。为简单起见,假设您的基础业务对象 (DataSource) 是Dictionary(Of String, String)

Dim dict As New Dictionary(Of String, String)
With dict
  .Add("1", "One")
  .Add("2", "Two")
  .Add("3", "Three")
End With

你有以下绑定:

With CheckedListBox1
  .DataSource = dict.ToList
  .ValueMember = "Key"
  .DisplayMember = "Value"
End With

微软似乎不希望我们使用这种方法,可能是由于兼容性问题。你知道这一点是因为.DataSource其他成员隐藏在智能感知中。但是,对于像上面这样的简单设置,它可以工作,只是不要依赖智能感知来输入这些成员。

现在假设您有一个按钮,其中包含以下代码:

Dim v = CheckedListBox1.CheckedItems

在这种情况下v,是底层业务对象的集合,对于上述情况,它将是KeyValuePair(Of String, String).

在您的情况下,您的业务对象是 type DataRecordInternal,因此您必须期望返回此类型并在代码中对其进行说明。请注意,它可能没有良好的行为ToString(),因此这不会像您期望的那样工作:

MsgBox(checkList_Facility.Items(i))

我相信您正在寻求进行一些处理,向用户发送有关每个检查项目的消息并不是很有用。因此,您可能希望使用不同的代码,例如:

Dim record As DataRecordInternal = checkList_Facility.Items(i)
'do some processing on record variable
于 2013-07-09T20:24:00.563 回答