[Visual Basic] Cambiare lo stato in checked delle checkbox richiamando dati dal database

migo80

Utente Attivo
25 Apr 2013
210
3
18
Buona sera, spero che mi possiate aiutare.
Vorrei un aiuto su come potrei fare, richiamando dei dati presenti su di un database access e memorizzati in questo modo:
nome del campo ckb_name
"checkbox1,checkbox2,checkbox3,checkbox4", confrontarli con le checkbox presenti nel form e far cambiare automaticamentelo status in checked alle sole checkbox con i nomi uguali a quelli dei dati su database.
Spero in un vostro aiuto, un grazie in anticipo!
 

Rikk73

Utente Attivo
7 Apr 2015
133
6
18
Arezzo
le checkbox hanno una proprietà che è appunto checked che accetta un valore booleano, da codice puoi semplicemente fare

Codice:
nomeCheckBox.Checked = condizione == true ? true : false;
 

migo80

Utente Attivo
25 Apr 2013
210
3
18
Grazie per avermi risposto ora le mostro il codice che crea le checkbox e il tutto funziona bene
Codice:
Private Sub frmTest_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        SQLString = "SELECT * FROM ckb_list"
        Dim posx As Integer, posy As Integer
        Conn = New OleDbConnection(connStr)
        Adapter = New OleDbDataAdapter(SQLString, Conn)
        Conn.Open()

        table = New DataTable()
        Adapter.Fill(table)
        nrec = table.Rows.Count
        ReDim arrCH(nrec - 1)
        For I As Integer = 0 To nrec - 1
            arrCH(I) = New CheckBox
            colore = table.Rows(I)("ckb_color").ToString
            posx = 6
            posy = 10 + 40 * I
            arrCH(I).Location = New Point(posx, posy)
            arrCH(I).Font = New Font("verdana", 8, FontStyle.Bold)
            arrCH(I).Size = New Size(495, 40)
            arrCH(I).ForeColor = Color.FromName(colore)
            arrCH(I).Text = table.Rows(I)("lista_ckb").ToString
            SplitContainer1.Panel1.Controls.Add(arrCH(I))
        Next
questo è la porzione di codice che mi salva le checkbox selezionate in una tabella chiamata "ckb_checked" anche questo funziona:

Codice:
Dim ckb_txt As String
        Dim checkedItems As New List(Of String)
        For Each cb As CheckBox In SplitContainer1.Panel1.Controls.OfType(Of CheckBox)()
            If cb.Checked Then
                checkedItems.Add(cb.Text)
            End If
        Next
        ckb_txt = String.Join(", ", checkedItems.ToArray)
'segue connessione e qury di insert
i dati vengono salvati nel seguente modo ad esempio: nome1, nome2, nome8, nome23
Ora, se io volessi richiamare al click del bottone carica questi dati salvati e far selezionare automaticamente le checkbox corrispondenti ai nomi salvati nella tabella in che modo posso fare?
Spero in un suo aiuto....
 

migo80

Utente Attivo
25 Apr 2013
210
3
18
Ho cercato di risolverlo da me e diciamo che funziona solo in parte cioè cliccando il pulsante mi seleziona solo una checkbox quella corrispondente al primo elemento dell'array splittato posto il codice

Codice:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim test As String

        Dim connStr2 As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\databaseTest.accdb"
        Conn2 = New OleDbConnection(connStr2)



        Dim command2 As OleDbCommand
        Conn2.Open()

        SQLString2 = "Select ckb_select from test_table"
        command2 = New OleDbCommand(SQLString2, Conn2)
        Dim rd As OleDbDataReader = command2.ExecuteReader


        rd.Read()
        test = rd.Item(0).ToString
        Conn2.Close()

        Dim ar As String() = test.Split(New Char() {","c})
        Dim sel_ckb As String

        For Each sel_ckb In ar

            For Each cb As CheckBox In SplitContainer1.Panel1.Controls

                If cb.Text = sel_ckb.ToUpper() Then
                    cb.Checked = True

                End If
            Next
        Next

    End Sub
Perchè il ciclo si ferma al primo elemento? come posso risolvere?
 

Rikk73

Utente Attivo
7 Apr 2015
133
6
18
Arezzo
Credo che il problema sia legato ai due foreach annidati, se ho capito bene ti salvi il nome delle checkbox selezionate e non il loro stato giusto? se così fosse è un approccio a mio avviso sbagliato.
Queste checkbox avranno un significato specifico, e quindi dovresti pensare di dedicare ad ognuna di loro un campo in una tabella che accetti un valore booleano (il checked appunto), poi dovrai fare il binding della UI alla tabella corrispondente.
Studiati un po' il binding dei dati, vedrai che trovi la soluzione che cerchi molto semplice.

Se vuoi seguire questa strada mi permetto di darti un'altro piccolo consiglio, nella tabella dove adesso salvi l'array dei nomi delle checkbox potresti salvare solo l'id che corrisponde alla riga della tabella con i valori delle checkbox
 

migo80

Utente Attivo
25 Apr 2013
210
3
18
Ho risolto in questo modo:
sostituito lo splitcontainer con ChecklistBox e riempendolo con i nomi memorizzati sul db,
e poi nel form load ho modificato il cilco for each che ciclava l'array dei dati prelevati dal db così:
Codice:
        Dim connStr2 As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=|DataDirectory|\
databaseTest.accdb"
        Conn2 = New OleDbConnection(connStr2)

        Dim command2 As OleDbCommand
        Conn2.Open()
        SQLString2 = "Select ckb_select from test_table"
        command2 = New OleDbCommand(SQLString2, Conn2)

        Dim rd As OleDbDataReader = command2.ExecuteReader

        rd.Read()
        test = rd.Item(0).ToString
        Conn2.Close()

        ar = test.ToString.Split(",")

        For Each sel_ckb In ar
            For i As Integer = 0 To CheckList1.Items.Count - 1

                If Me.CheckList1.Items(i).ToString.Contains(sel_ckb.ToUpper()) Then
                    MsgBox(Me.CheckList1.Items(i).ToString)

                    Me.CheckList1.SetItemChecked(i, True)
                End If


            Next

        Next
Il tutto funziona perfettamente.
 
  • Like
Reactions: Rikk73