Как проверить элементы массива в CheckListBox

У меня есть флажок с некоторым значением, скажем, Apple Peach Lemon. Эти значения взяты из набора данных.

У меня есть массив с Apple и Lemon: {Apple, Lemon}. Как проверить в контрольном списке каждое значение, прочитанное в этом массиве?

РЕДАКТИРОВАТЬ: в моем случае контрольный список заполнялся с использованием набора данных, предоставленного запросом SQL.


person 8oris    schedule 02.04.2021    source источник


Ответы (3)


В следующем примере кода данные из SQL-Server (база данных не имеет значения, но это то, что я использовал, важно то, что контейнер, в который загружаются данные, загружается в список.

введите здесь описание изображения

Контейнер для хранения данных

Public Class Category
    Public Property Id() As Integer
    Public Property Name() As String

    Public Overrides Function ToString() As String
        Return Name
    End Function
End Class

Класс для чтения данных

Imports System.Data.SqlClient

Public Class SqlOperations
    Private Shared ConnectionString As String =
                "Data Source=.\SQLEXPRESS;Initial Catalog=NorthWind2020;Integrated Security=True"

    Public Shared Function Categories() As List(Of Category)
        Dim categoriesList = New List(Of Category)
        Dim selectStatement = "SELECT CategoryID, CategoryName FROM Categories;"

        Using cn As New SqlConnection With {.ConnectionString = ConnectionString}
            Using cmd As New SqlCommand With {.Connection = cn}

                cmd.CommandText = selectStatement

                cn.Open()

                Dim reader = cmd.ExecuteReader()
                While reader.Read()
                    categoriesList.Add(New Category() With {.Id = reader.GetInt32(0), .Name = reader.GetString(1)})
                End While


            End Using

        End Using

        Return categoriesList

    End Function

End Class

Метод расширения

Который может проверить или снять отметку со значения, если оно найдено в CheckedListBox и нечувствительно к регистру.

Public Module Extensions
    <Runtime.CompilerServices.Extension>
    Public Function SetCategory(sender As CheckedListBox, text As String, Optional checkedValue As Boolean = True) As Boolean

        If String.IsNullOrWhiteSpace(text) Then
            Return False
        End If

        Dim result = CType(sender.DataSource, List(Of Category)).
                Select(Function(item, index) New With
                          {
                            Key .Column = item,
                            Key .Index = index
                          }).FirstOrDefault(Function(this) _
                             String.Equals(this.Column.Name, text, StringComparison.OrdinalIgnoreCase))

        If result IsNot Nothing Then
            sender.SetItemChecked(result.Index, checkedValue)
            Return True
        Else
            Return False
        End If
    End Function

End Module

Код формы

Public Class ExampleForm
    Private Sub Form2_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        CheckedListBox1.DataSource = SqlOperations.Categories
    End Sub

    Private Sub CheckCategoryButton_Click(sender As Object, e As EventArgs) Handles CheckCategoryButton.Click
        CheckedListBox1.SetCategory(CategoryToCheckTextBox.Text, StateCheckBox.Checked)
    End Sub
End Class

Чтобы проверить все сразу

Private Sub CheckAllButton_Click(sender As Object, e As EventArgs) Handles CheckAllButton.Click
    CType(CheckedListBox1.DataSource, List(Of Category)).
        ForEach(Sub(cat) CheckedListBox1.SetCategory(cat.Name, True))
End Sub
person Karen Payne    schedule 04.04.2021
comment
Спасибо Карен за этот очень подробный ответ, это работает! Кстати, я не понимаю, почему действительно сложно иметь дело с чек-листом - person 8oris; 06.04.2021

Вы не упомянули, как именно CheckedListBox заполняется DataSet, я сделал предположение, что вы добавляете строки непосредственно в коллекцию Items.

Этот код будет просто перебирать CheckedListBox и сравнивать значения с массивом, независимо от результата совпадения, Checkbox либо отмечен, либо очищен.

    Dim theArray() As String = {"Apple", "Lemon"}

    For counter As Integer = 0 To CheckedListBox1.Items.Count - 1

        Dim currentItem As String = CheckedListBox1.Items(counter).ToString

        Dim match As Boolean = theArray.Contains(currentItem.ToString)

        CheckedListBox1.SetItemChecked(counter, match)
    Next
person JayV    schedule 02.04.2021

Используйте метод SetItemChecked следующим образом:

CheckedListBox1.SetItemChecked(CheckedListBox1.Items.IndexOf("your item goes here"), True)

Обратите внимание, что если элемент не существует, будет выдано исключение, поэтому обязательно проверьте наличие элемента перед вызовом метода SetItemChecked(). Для этого вы можете проверить возвращаемое значение IndexOf(). Будет -1, если элемент не существует.

person Sideways    schedule 02.04.2021