Combobox e database

di il
36 risposte

Combobox e database

Ciao a tutti, nel form del mio programma ho creato una combobox che dovrebbe popolarsi con dei dati presi da un database.
Uso VB Studio Express 2010 e a sinistra ho aggiunto una dataSource, ho collegato un database access eccetera. Tutto funziona e a sinistra, sotto dataSource mi visualizza perfettamente le tabelle del mio database e le varie colonne.
All'interno del database c'è una tabella chiamata "Gare" con una colonna chiamata "Denominazione" e io vorrei che le varie denominazioni delle gare venissero mostrate nella combobox. Come posso fare?
Credo sia qualcosa del tipo combobox.datasource....... però non so come continuare e i vari esempi che ho visto su internet fanno il caso di partenza da zero e quindi tutto con codice, mentre il database io l'ho collegato tramite wizard di VB studio

36 Risposte

  • Re: Combobox e database

    Ciao mimonic

    Selezioni la property DataSource del ComboBox e la colleghi alla tabella 'Gare' dell' oggetto BindingSource che il wizard ti ha creato. Poi selezioni la property DisplayMember sempre del ComboBox, ti verranno proposte le colonne della tabella 'Gare' e selezioni la colonna 'Denominazione'.

    Bye
  • Re: Combobox e database

    Perfetto, grazie!
    poi in un'altra combobox dovrei visualizzare il nome del giocatore. il problema è che nel database cognome e nome sono separati, mentre nella combo vorrei una cosa tipo Rossi Mario. Ho provato a mettere cognome & nome in displaymember ma prende solo il cognome. come si può fare?
  • Re: Combobox e database

    No niente, quello è un problema superato: ho modificato il database mettendo in un unico campo sia il nome che il cognome.
    Il problema ora è un altro: vorrei che quando l'utente seleziona un nome nella lista, un'altra textbox mostrasse un valore ottenuto con un'interrogazione al database tipo
    "select quello_che_vuoi from Giocatori where nome = quello_che_hai_selezionato"
    come posso fare?
  • Re: Combobox e database

    minomic ha scritto:


    ho modificato il database mettendo in un unico campo sia il nome che il cognome.
    Ho visto che hai risolto il problema quando avevo già preparato la risposta per cui te la mando allo stesso. Potrà tornarti utile in altre occasioni in cui non puoi riunire in campi nel database.

    minomic ha scritto:


    perfetto, grazie!
    poi in un'altra combobox dovrei visualizzare il nome del giocatore. il problema è che nel database cognome e nome sono separati, mentre nella combo vorrei una cosa tipo Rossi Mario. Ho provato a mettere cognome & nome in displaymember ma prende solo il cognome. come si può fare?
    Si può fare, anche se non è immediato.

    Il problema è che la property 'DisplayMember' accetta solo il nome di una colonna e una colonna che unisce il Nome e il Cognome non esiste, la soluzione stà nel crearla, ovviamente non nel database ma nel DataSource. Segui i seguenti passi:

    - Vai sul DataSource e col tasto delstro seleziona 'Edit DataSet With Designer' (ti appare una schermata .xsd con dei riquadri)

    - Vai sull' header della tua tabella, tasto destro, 'Add Column' e aggiungi la colonna 'NomeCompleto'

    - Nella parte bassa c' è il riquadro del DataAdapter, vai sul suo header, tasto destro, 'Configure' (ti appare un box con una query SQL)

    - Nella parte di Select aggiungi ", Nome + ' ' + Cognome as NomeCompleto" e chiudi

    A quersto punto il data set ha una colonna in piu cre viene creata unendo nome e cognome e che puoi assegnare a 'DisplayMember'
  • Re: Combobox e database

    Ottimo! e per quanto riguarda l'altro problema (che mi sembra un più complesso)?
    comunque grazie davvero per l'aiuto
  • Re: Combobox e database

    Ci sono vari approcci e varie tecniche, al momento lo stato dell' arte sono le query LINQ.

    Il Wizard ti ha creato un oggetto di tipo DataSet, probabilmente si chiama GareDataSet. Il DataSet conriene varie tabelle, ad esempio la tabella Giocatori, su questa tabella puoi fare delle query LINQ.

    Nel SelectedIndexChanged del ComboBox scrivi questo:
    
      Dim nomeScelto as String = ComboBox1.Text;
    
      Dim table As DataTable = GareDataSet.Tables("Giocatori")
      Dim v = From o In table
                 Where o.Item("Nome") = nomeScelto
                 Select o.Item("QuelloCheTiPare")
    
      TextBox.Text = v(0)
    
    (non ho messo controlli se v contiene elementi, tanto è un esempio).
    Bye
  • Re: Combobox e database

    Per prima cosa vorrei dirti che funziona perfettamente.
    non conoscevo la sintassi precisa, però capisco quello che fa quel codice. l'unica cosa che non capisco è quella variabile di appoggio v dichiarata senza tipo (dovrebbe quindi essere variant?). E poi il fatto che nell'ultima riga sembra che sia diventato un array (infatti si usa v(0)).
    Inoltre ne approfitto per chiederti altre informazioni, visto che sei molto gentile e disponibile: sempre all'interno dello stesso database, c'è un'altra tabella che si chiama "risultati" con campi "gara", "nome", "risultato". vorrei che con un clic sul pulsante "inserisci" questi dati venissero "pescati" dal form e inseriti nella tabella. Credo sia una cosa abbastanza simile a quella di prima, però non sono sicuro... Ovviamente prometto di studiare per bene le query LINQ ma intanto ti chiedo una mano per questo problema.
    Grazie ancora, davvero.
  • Re: Combobox e database

    mimonic ha scritto:


    l'unica cosa che non capisco è quella variabile di appoggio v dichiarata senza tipo (dovrebbe quindi essere variant?). E poi il fatto che nell'ultima riga sembra che sia diventato un array (infatti si usa v(0)).
    No, non è un variant. Il .NetFramework supporta i tipi anomini ovvero permette in particolari circostanze di non specificare il tipo e lascia al compilatore il compito di dedurlo. Comunque la variabile è tipizzata solo che non lo scrivi. Avresti potuto specificare il tipo e non sarebbe cambiato niente:
    
        Dim v As EnumerableRowCollection(Of Object) = From o In table ... ecc.
    

    mimonic ha scritto:


    c'è un'altra tabella che si chiama "risultati" con campi "gara", "nome", "risultato". vorrei che con un clic sul pulsante "inserisci" questi dati venissero "pescati" dal form e inseriti nella tabella.
    Puoi scrivere qualcosa del genere (Il wizard dovrebbe averti creato una classe Adapter probabilmente si chiama GareAdapter1):
    
            Dim table As DataTable = GareDataSet.Tables("Risultati")
            Dim row As DataRow = table.NewRow()
            row("Nome") = "gigio"
            row("Risultato") = "vittoria"
            table.Rows.Add(row)
            GareAdapter1.Update(GareDataSet)  
            GareDataSet.AcceptChanges()
    

    mimonic ha scritto:


    Ovviamente prometto di studiare per bene le query LINQ
    Bravo!
  • Re: Combobox e database

    Per prima cosa grazie della risposta! Purtroppo però non funziona, nel senso che non dà nessun errore ma se poi vado ad aprire il database non è stata inserita alcuna riga.
    Posto il codice che ho scritto (leggermente ispirato al tuo ) e anche un'immagine di come è fatta la tabella così non sbagliamo...
     Private Sub Button5_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonInserisci.Click
            Dim table As DataTable = GolfDataSet.Tables("Risultati")
            Dim row As DataRow = table.NewRow()
            row("Gara") = Convert.ToString(ComboBoxGara.Text)
            row("Nome") = Convert.ToString(ComboBoxNome.Text)
            row("Netto") = Convert.ToInt16(box_netto.Text)
            row("Lordo") = Convert.ToInt16(box_lordo.Text)
            row("Seconde_nove") = Convert.ToInt16(box_seconde_netto.Text)
            table.Rows.Add(row)
            GareTableAdapter.Update(GolfDataSet)
            GolfDataSet.AcceptChanges()
            MsgBox("Informazioni inserite")
    
        End Sub
    e questa è la tabella
    come puoi vedere nel codice non ho messo niente per il campo ID anche perchè vorrei che si incrementasse da solo (come dovrebbe).
    Riesci a dirmi dove sbaglio? Grazie!
  • Re: Combobox e database

    Il codice è giusto, non ci sono errori, ho provato un codice praticamente identico e mi funziona. Prova a controllare se per caso è stata creata una copia del database in qualche cartella del tuo progetto e sta lavorando su questa (a volte col wizard succedono questi scherzi, a un certo punto ti domanda se duplicarlo).
  • Re: Combobox e database

    Infatti ho ben tre copie del database: una (originale) nella cartella documenti, una nella cartella debug e una nella cartella release ma non succede niente in nessuna di queste!
    Per quella cosa dell'ID non si deve poi scrivere niente?
    Comunque faccio qualche altro tentativo...
  • Re: Combobox e database

    Ho risolto! bastava sostituire GareTableAdapter con RisultatiTableAdapter perchè è la tabella "Risultati" che viene modificata!
  • Re: Combobox e database

    Torno a chiedere informazioni: per far funzionare quel codice che mi avevi dato per inserire nuovi record nella tabella ho scritto questo
    Private Sub Button5_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles ButtonInserisci.Click
            Dim adapter_prima = New RisultatiPrimaTableAdapter      'inventato ma funziona!
            Dim adapter_seconda = New RisultatiSecondaTableAdapter  'inventato ma funziona!
            Dim handicap As Integer = Convert.ToInt32(hcp_label.Text)
    
            Dim tavola As DataTable = GolfDataSet.Tables("Gare")        'cerco il tipo di gara
            Dim v = From o In tavola
                    Where o.Item("Denominazione") = ComboBoxGara.Text
                    Select o.Item("Tipo")
    
            Dim tipo As String = v(0)       'in tipo c'è "Stableford" o "Medal"
            'MsgBox(tipo)
            If tipo = "Stableford" Then
                If handicap < 18 Then
                    Dim table As DataTable = GolfDataSet.Tables("RisultatiPrima")
                    Dim row As DataRow = table.NewRow()
                    row("Gara") = ComboBoxGara.Text
                    row("Nome") = ComboBoxNome.Text
                    row("Handicap") = Convert.ToInt16(hcp_label.Text)
                    row("Netto") = Convert.ToInt16(box_netto.Text)
                    row("Lordo") = Convert.ToInt16(box_lordo.Text)
                    row("Seconde nove") = Convert.ToInt16(box_seconde_netto.Text)
                    table.Rows.Add(row)
                    adapter_prima.Update(GolfDataSet)
                Else...
    e dato che non mi aveva creato i tableadapter per le tabelle "RisultatiPrima" e "RisultatiSeconda" li ho creati io facendo
    Dim adapter_prima = New RisultatiPrimaTableAdapter      'inventato ma funziona!
    Dim adapter_seconda = New RisultatiSecondaTableAdapter  'inventato ma funziona!
    Tutto funziona bene, ma volevo sapere se è un caso o se c'è del senso in quello che ho fatto...
  • Re: Combobox e database

    Ciao minomic,

    Si, tranquillo il senso c' è. Anzi personalmente mi trovo più a mio agio a creare gli Adapter, DataSet ecc nel codice piuttosto che a usare i Wizard, comunque sono gusti.
    Buon proseguimento
Devi accedere o registrarti per scrivere nel forum
36 risposte