Valore id ComboBox in SQL Server

di il
7 risposte

Valore id ComboBox in SQL Server

Ho provato a cercare nel forum (anche in rete, per la verità), ma non ho trovato niente che faccia al caso mio e scusate la banalità della domanda.
Sto imparando un nuovo metodo per gestire le combobox utilizzando il Data Table.
Per studio ho creato questa form
Form.png
Form.png

che inserisce i dati in tre tabelle: Teachers - Classes - Subject.
Lo scopo dello studio è imparare a inserire più volte il valore della stessa combobox in un unico inserimento.

Per popolare la prima combo CBFirstClass ho usato questa funzione:

public void FirstClassComboBox()
{
SqlConnection conn = new SqlConnection(myconnstrng);

conn.Open();
SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM Classes", conn);
DataTable firstClassDT = new DataTable();
adapter.Fill(firstClassDT);

CBFirstClass.DataSource = firstClassDT;
CBFirstClass.ValueMember = "IdClass";
CBFirstClass.DisplayMember = "Class";

DataRow topItem = firstClassDT.NewRow();
topItem[0] = 1;
topItem[1] = "";
firstClassDT.Rows.InsertAt(topItem, 0);
CBFirstClass.DataSource = firstClassDT;

conn.Close();
}

Ho creato prima le classi per il metodo getter/setter con le quali pescare i campi dal database; quindi ho creato i metodi per l'inserimento, la modifica e la cancellazione dei record, utilizzando il costrutto try/catch/finally.
Infine, ho richiamato i metodi abbinandoli ai vari pulsanti.

Per il pulsante SAVE non riesco ad abbinare il valore ID della combo al campo del database (valore intero e chiave esterna)

tBLL è l'oggetto della classe di cui al metodo getter/setter
tDAL è l'oggetto della classe di cui al metodo che contiene le query di esecuzione dei comandi.

private void btnAdd_Click(object sender, EventArgs e)
{
tBLL.Name = txtName.Text;
tBLL.Surname = txtSurname.Text;
tBLL.IdClass = ?
tBLL.IdSubject = ?


bool outcome = tDAL.InsertTeacher(tBLL);

if(outcome == true)
{
MessageBox.Show("Inserimento effettuato");
ClearTextBox();
}
else
{
MessageBox.Show("Inserimento non riuscito");
}
}

Ho provato ad usare:

SelectedIndex e SelectedValue ma mi dà sempre errore.

7 Risposte

  • Re: Valore id ComboBox in SQL Server

    Ciao, per ottenere il valore (sotto forma di stringa) della scelta selezionata nella ComboBox "First Class", basta che tu scrivi:

    tBLL.IdClass = CBFirstClass.SelectedItem.ToString();

    Analogamente puoi fare per le altre tre ComboBox della tua form...
  • Re: Valore id ComboBox in SQL Server

    Non lo accetta. Dice che non è possibile convertire il tipo string in tipo int.
  • Re: Valore id ComboBox in SQL Server

    Non ho seguito bene il thread ma non puoi fare un cast al tipo intero di CBFirstClass.SelectedItem.ToString(); ? , prova a fare il cast con (int)CBFirstClass.SelectedItem.ToString() oppure usando la System.Convert.ToInt32(CBFirstClass.SelectedItem.ToString());
  • Re: Valore id ComboBox in SQL Server

    gian82 ha scritto:


    Non ho seguito bene il thread ma non puoi fare un cast al tipo intero di CBFirstClass.SelectedItem.ToString(); ? , prova a fare il cast con (int)CBFirstClass.SelectedItem.ToString() oppure usando la System.Convert.ToInt32(CBFirstClass.SelectedItem.ToString());
    Ho provato con entrambe le soluzioni, ma tutte e due quando provo ad inserire un record segnalano errore: {"Formato della stringa di input non corretto."}
  • Re: Valore id ComboBox in SQL Server

    Prova a vedere in debug cosa vale CBFirstClass.SelectedItem.ToString() , prova ad usare selected value e poi fai il cast così: (int)comboBox1.SelectedValue
  • Re: Valore id ComboBox in SQL Server

    Salve,
    .SelectedItem e' un'istanza di DataRowView, quindi tendenzialmente ti basta castarlo e recuperare il valore della colonna referenziata,
    
    private void button1_Click(object sender, EventArgs e)
    {
    
        Console.WriteLine(comboBox1.SelectedItem);
        Console.WriteLine("Valore corrente: {0}", dtMainData.Rows[0]["RefId"]);
    
        dtMainData.Rows[0]["RefId"] = ((DataRowView) comboBox1.SelectedItem)["Id"];
        Console.WriteLine("Valore modificato: {0}", dtMainData.Rows[0]["RefId"]);
    
    }
    ma tecnicamente anche SelectedValue dovrebbe essere valido visto che dovrebbe essere associato dal combobox.ValueMenber("RefId")
    saluti omnia
    --
    Andrea
  • Re: Valore id ComboBox in SQL Server

    Purtroppo, nonostante i vostri suggerimenti, il sistema continua a segnalare errori.
    In questi giorni ho provato varie combinazioni, senza ottenere alcunché.
    Per non impantanarmi e proseguire con lo studio ho utilizzato una LIST per popolare le Combobox e creando una funzione, una per ogni combobox, per gestire la chiave primaria della tabella interessata.
    Non è la soluzione ideale, ma per il momento mi accontento. In futuro vedrò di approfondire il metodo con il datatable.

    Scrivo il codice soprattutto per i principianti.

    Ho creato un oggetto per la classe list (uno per le classi e uno per le materie):
          List<int> ClassCode = new List<int>();
                     List<int> SubjectCode = new List<int>();
    Quindi le due funzioni per popolare le combo, con un ciclo WHILE:
    public void PopulateFirstClassCB()
            {
                SqlConnection conn = new SqlConnection(myconnstrng);
                conn.Open();
    
                string sql = "SELECT * FROM Classes";
                SqlCommand cmd = new SqlCommand(sql, conn);
                SqlDataReader reader = cmd.ExecuteReader();
    
                while (reader.Read())
                {
                    ClassCode.Add((int)reader["IdClass"]);
                    CBFirstClass.Items.Add(reader["Class"]);
                }
                CBFirstClass.SelectedIndex = 0;
    
                conn.Close();
            }
    Quindi ho richiamato nell'evento LOAD la funzione con la riga: PopulateFirstClassCB() (e lo stesso con la funzione PopulateFirstSubject()).

    Infine nell'evento ADD, che inserisce i dati nel database:
    private void btnAdd_Click(object sender, EventArgs e)
            {
                tBLL.Name = txtName.Text;
                tBLL.Surname = txtSurname.Text;
                tBLL.IdClass = ClassCode[CBFirstClass.SelectedIndex];
                tBLL.IdSubject = SubjectCode[CBFirstSubject.SelectedIndex];
    
                bool outcome = tDAL.InsertTeacher(tBLL);
    
                if(outcome == true)
                {
                    MessageBox.Show("Inserimento effettuato");
                    ClearTextBox();
                }
                else
                {
                    MessageBox.Show("Inserimento non riuscito");
                }
            }
    
    Dove in prossimità delle chiavi esterne relative alle tabelle relazionate ho - per la chiave primaria - richiamato l'oggetto della classe lista - ClassCode (o SubjectCode) - e ho richiamato il metodo SelectedIndex della combo interessata.

    Se qualcuno scopre come fare lo stesso con il Datatable lo ringrazio anticipatamente. Alla prossima.
Devi accedere o registrarti per scrivere nel forum
7 risposte