根据另一个 CheckedListbox 的检查值从数据库中填充 CheckedListbox

Posted

技术标签:

【中文标题】根据另一个 CheckedListbox 的检查值从数据库中填充 CheckedListbox【英文标题】:Fill a CheckedListbox from a database based on checked values of another CheckedListbox 【发布时间】:2021-11-14 07:53:49 【问题描述】:

我正在使用 SQL Server 2016 Visual Studio 2017。 需要根据Checkedlistbox1的SelectedItem的值,从我的数据库中填写checkedlistbox2

我在 Form.Load 上填写 checkedlistbox1,如下所示: 此代码正在运行。

Private Sub fillChkboxList()
    Dim conn As New SqlConnection("Data Source=192.168.200.36;user id=sa;password=XXXX@123;database=XXXXXXX")
    Dim sda As New SqlDataAdapter("select DepartmentName, DepartmentID from DepartmentMain where active=1 order by DepartmentName", conn)
    Dim dt As New DataTable
    sda.Fill(dt)
    CheckedListBox1.DataSource = dt
    CheckedListBox1.DisplayMember = "DepartmentName"
    CheckedListBox1.ValueMember = "DepartmentID"
End Sub

这里我尝试使用一种方法来填充Checkedlistbox2,我在Checkedlistbox1ItemCheck事件处理程序中调用它:

下面的代码没有给出所需的结果

Public Function fillChkboxListSub()
    Dim i As Integer
    Dim conn1 As New SqlConnection("Data Source=192.168.200.36;user id=sa;password=XXXX@123;database=XXXXXXX")

    With CheckedListBox2
        For i = 0 To CheckedListBox1.Items.Count - 1 Step i + 1
            If CheckedListBox1.GetItemCheckState(i) = CheckState.Checked Then
                Dim xx As String = (CType(CheckedListBox1.Items(i), DataRowView))("DepartmentID")
                Dim sqlstr2 As String = "select SubName,SubDeptID from DepartmentSub where active=1 and DepartmentID in ('" & xx & "') order by SubName"
                Dim command2 As New SqlCommand(sqlstr2, conn1)
                Dim adpt2 As New SqlDataAdapter(command2)
                adpt2.SelectCommand = command2
                adpt2.Fill(dt2)

                CheckedListBox2.DataSource = dt2
                CheckedListBox2.DisplayMember = "SubName"
                CheckedListBox2.ValueMember = "SubDeptID"
            End If
        Next
    End With
End Function

我正在调用的这个函数:

Private Sub CheckedListBox1_ItemCheck(sender As Object, e As ItemCheckEventArgs) Handles CheckedListBox1.ItemCheck
    fillChkboxListSub()
End Sub

我没有得到结果。 如果我检查checkedlistbox1 中的(DepartmentName),SubDeptName 应该加载到checkedlistbox2。如果我在checkedlistbox1 中取消选择相同的选项,则应将其从checkedlistbox2 中删除或删除,请帮助提供工作代码示例。 提前致谢

【问题讨论】:

似乎在每个选中的项目中,您都会开始查询以提取相关记录并替换您之前在循环中放入列表中的任何内容。您需要首先提取所有选中的项目并将它们添加到列表中。只有在循环结束时才要求将数据插入到第二个列表中 您知道ItemCheck 事件是在项目状态更改之前引发的吗?您需要查看e.NewValue 属性以了解该项目是处于选中状态还是未选中状态。 请推荐一些工作示例 亲爱的,请帮我改正代码,我尝试了 4 天但没有得到正确答案,请提供代码示例或在上面的代码中纠正我 函数需要数据类型和返回语句。如果您没有返回任何内容,请使用 Sub。 【参考方案1】:

大多数数据库对象都需要被释放。 Connections、Commands 和 DataReaders 有一个 Dispose 方法,必须调用该方法才能释放它们使用的非托管资源。使用Using...End Using 块可以确保即使出现错误也会调用Dispose,这对我们来说很容易。

设置DataSourceDisplayMemberValueMember 的顺序很重要。设置 DataSource 应该是 最后 行。如果在DataSource 之前设置ValueMember,则不会触发任何操作。如果您先设置Datasource,该框将为您绑定值成员。然后,您将设置一个新的ValueMember(您想要的那个),并且盒子将不得不重新绑定。所以,如果你最后设置DataSource,绑定只会发生一次。

您可以使用CheckedItems 集合进行循环。将 eacn 项目添加到列表中。在循环之后使用带有逗号分隔符的Join 来为 sql 字符串准备 In 子句。我使用插值字符串来构建前面$ 指示的sql 字符串。然后可以将变量插入由 包围的行中。

Private CnString As String = "Data Source=192.168.200.36;user id=sa;password=XXXX@123;database=XXXXXXX"
Private Sub fillChkboxList1()
    Dim dt As New DataTable
    Using conn As New SqlConnection(CnString),
        cmd As New SqlCommand("select DepartmentName, DepartmentID from DepartmentMain where active=1 order by DepartmentName", conn)
        conn.Open()
        Using reader = cmd.ExecuteReader
            dt.Load(reader)
        End Using
    End Using
    CheckedListBox1.DisplayMember = "DepartmentName"
    CheckedListBox1.ValueMember = "DepartmentID"
    CheckedListBox1.DataSource = dt
End Sub
Public Sub fillChkboxList2()
    Dim lst As New List(Of Integer)
    For Each item In CheckedListBox1.CheckedItems
        Dim drv = DirectCast(item, DataRowView)
        Dim DepId As Integer = CInt(drv("DepartmentId"))
        lst.Add(DepId)
    Next
    Dim DepIdString = String.Join(",", lst)
    Dim sql As String = $"select SubName,SubDeptID from DepartmentSub where active=1 and DepartmentID in (DepIdString) order by SubName"
    Debug.Print(sql) 'See if your select string looks correct.
    Dim dt As New DataTable
    Using cn As New SqlConnection(CnString),
            cmd As New SqlCommand(sql, cn)
        cn.Open()
        Using reader = cmd.ExecuteReader
            dt.Load(reader)
        End Using
    End Using
    CheckedListBox2.DisplayMember = "SubName"
    CheckedListBox2.ValueMember = "SubDeptID"
    CheckedListBox2.DataSource = dt
End Sub

【讨论】:

上面的代码给了我一些语法错误,比如')'附近的语法不正确。并通过在显示成员填充我的第一个选中列表框之前提供数据源,低于值的成员没有给我结果 我猜这个错误来自查询字符串。你能让我看看立即窗口中打印的字符串吗?

以上是关于根据另一个 CheckedListbox 的检查值从数据库中填充 CheckedListbox的主要内容,如果未能解决你的问题,请参考以下文章

搜索checklistbox的文本框,但不记得检查的项目C#C调

检查另一个输入时如何根据一个输入更改值?反应钩子

检查列中是不是存在值并根据不同条件在另一个 Pandas 中更改:Pandas

CheckedListbox Displaymember 和 ValueMember

C# Winform中 选中DatagridView控件中某行如何将该行某个字段(1,2,3,4,)的值绑定CheckedListBox控件的数

如何将选中的项目从checkedlistbox 插入SQL 数据库?