none
Popolare una ToolStripComboBox prelevando i dati da un TableAdapter

    Domanda

  • Sto realizzando un programma con visual basic 2010 E.E. e mi sono bloccato in una ToolStripComboBox non riesco a popolare.

    Ho provato a scrivere il seguente codice:

    Private Sub ProvinciaToolStripComboBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ProvinciaToolStripComboBox.SelectedIndexChanged
            ProvSele = ProvinciaToolStripComboBox.SelectedItem
            
            ComuniToolStripComboBox.Items.Add(Me.ComuniTableAdapter.RicercaComuniFillBy(Me.ComuniDataSet.Comuni, ProvSele))

    ma non funziona.

    Qualcuno può darmi qualche spunto?

    Grazie

    Giorgio


    Giorgio

    giovedì 21 marzo 2013 19:13

Risposte

  • Sto realizzando un programma con visual basic 2010 E.E. e mi sono bloccato in una ToolStripComboBox non riesco a popolare.

    Ho provato a scrivere il seguente codice:

    Private Sub ProvinciaToolStripComboBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ProvinciaToolStripComboBox.SelectedIndexChanged
            ProvSele = ProvinciaToolStripComboBox.SelectedItem
            
            ComuniToolStripComboBox.Items.Add(Me.ComuniTableAdapter.RicercaComuniFillBy(Me.ComuniDataSet.Comuni, ProvSele))

    ma non funziona.

    Qualcuno può darmi qualche spunto?

    Grazie

    Giorgio


    Giorgio

    Spero tu non voglia popolare il combobox con quel codice... Quello è quello della selezione.

    Comunque è possibile, e non solo, è anche semplice e veloce da fare.

    Distinguiamo le cose possibile in due parti, che sono il popolare il combo e poi estrarre i dati, così chiudiamo il cerchio.

    Per popolare il combobox hai una serie infame di possibilità, tutte altrettanto valide.

    Te ne propongo una, forse la più "sbrodolosa"...

    Supponiamo che tu non voglia fare una cosa estremamente becera ma voglia prendere i dati da un TableAdapter o da un dataset.

    Su un ComboBox normale, vai a caricarti la sorgente dei dati (ovvero il dataset), dopo di che gli associ un BindingSource, e quindi vai ad impostare le proprietà DataSource, DisplayMember e ValueMember, in maniera opportuna.

    Qui è quasi la stessa cosa. Tranne per il fatto che devi andare a fare tutto questo non sul ToolStripComboBox ma sul ComboBox al suo interno...

       Me.DsTest1.DataTable1.AddDataTable1Row(1, "CUNEO")
            Me.DsTest1.DataTable1.AddDataTable1Row(2, "TORINO")
            Me.DsTest1.DataTable1.AddDataTable1Row(3, "Terzo mondo")
            Me.ToolStripComboBox1.ComboBox.DataSource = Me.BindingSource1
            Me.ToolStripComboBox1.ComboBox.DisplayMember = "Descrizione"
            Me.ToolStripComboBox1.ComboBox.ValueMember = "Id"

    In allegato, vedi esattamente come ho fatto nelle mie prove da 3 minuti.

    Le prime tre righe mi sono caricato qualcosa, le seconde 3 ho collegato il BindingSource al combobox.

    Per estrarre i dati... niente di più facile.

        Private Sub ToolStripComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ToolStripComboBox1.SelectedIndexChanged
            Dim riga As dsTest.DataTable1Row = CType(Me.ToolStripComboBox1.SelectedItem, DataRowView).Row
        End Sub

    Ovviamente il tutto va adattato al tuo caso specifico.

    NON E' DETTO CHE TU DEBBA OBBLIGATORIAMENTE PASSARE PER UN BINDING SOURCE o per il combobox contenuto. Esistono altre maniere.

    Questo è solo il mio spunto di riflessione.

    venerdì 22 marzo 2013 08:11

Tutte le risposte

  • Sto realizzando un programma con visual basic 2010 E.E. e mi sono bloccato in una ToolStripComboBox non riesco a popolare.

    Ho provato a scrivere il seguente codice:

    Private Sub ProvinciaToolStripComboBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ProvinciaToolStripComboBox.SelectedIndexChanged
            ProvSele = ProvinciaToolStripComboBox.SelectedItem
            
            ComuniToolStripComboBox.Items.Add(Me.ComuniTableAdapter.RicercaComuniFillBy(Me.ComuniDataSet.Comuni, ProvSele))

    ma non funziona.

    Qualcuno può darmi qualche spunto?

    Grazie

    Giorgio


    Giorgio

    Spero tu non voglia popolare il combobox con quel codice... Quello è quello della selezione.

    Comunque è possibile, e non solo, è anche semplice e veloce da fare.

    Distinguiamo le cose possibile in due parti, che sono il popolare il combo e poi estrarre i dati, così chiudiamo il cerchio.

    Per popolare il combobox hai una serie infame di possibilità, tutte altrettanto valide.

    Te ne propongo una, forse la più "sbrodolosa"...

    Supponiamo che tu non voglia fare una cosa estremamente becera ma voglia prendere i dati da un TableAdapter o da un dataset.

    Su un ComboBox normale, vai a caricarti la sorgente dei dati (ovvero il dataset), dopo di che gli associ un BindingSource, e quindi vai ad impostare le proprietà DataSource, DisplayMember e ValueMember, in maniera opportuna.

    Qui è quasi la stessa cosa. Tranne per il fatto che devi andare a fare tutto questo non sul ToolStripComboBox ma sul ComboBox al suo interno...

       Me.DsTest1.DataTable1.AddDataTable1Row(1, "CUNEO")
            Me.DsTest1.DataTable1.AddDataTable1Row(2, "TORINO")
            Me.DsTest1.DataTable1.AddDataTable1Row(3, "Terzo mondo")
            Me.ToolStripComboBox1.ComboBox.DataSource = Me.BindingSource1
            Me.ToolStripComboBox1.ComboBox.DisplayMember = "Descrizione"
            Me.ToolStripComboBox1.ComboBox.ValueMember = "Id"

    In allegato, vedi esattamente come ho fatto nelle mie prove da 3 minuti.

    Le prime tre righe mi sono caricato qualcosa, le seconde 3 ho collegato il BindingSource al combobox.

    Per estrarre i dati... niente di più facile.

        Private Sub ToolStripComboBox1_SelectedIndexChanged(sender As System.Object, e As System.EventArgs) Handles ToolStripComboBox1.SelectedIndexChanged
            Dim riga As dsTest.DataTable1Row = CType(Me.ToolStripComboBox1.SelectedItem, DataRowView).Row
        End Sub

    Ovviamente il tutto va adattato al tuo caso specifico.

    NON E' DETTO CHE TU DEBBA OBBLIGATORIAMENTE PASSARE PER UN BINDING SOURCE o per il combobox contenuto. Esistono altre maniere.

    Questo è solo il mio spunto di riflessione.

    venerdì 22 marzo 2013 08:11
  • Grazie Davide per il tuo “spunto di riflessione” , ma penso di non essermi spiegato bene. Riassumo il mio caso:

    Ho un database costituito da due tabelle: Provincie e Comuni, dove all'interno sono memorizzati tutte le provincie e tutti i comuni d'Italia. Tra le due tabelle ho creato una relazione: selezionando una provincia mi visualizza tutti i Comuni relativi.

    Pertanto ho creato l'oggetto ProvincieToolStripComboBox, che popolo indipendentemente dalla tabella Provincie (non collegato al database); selezionando una determinata provincia vorrei popolare l'altro oggetto ComuniToolStripComboBox con tutti i comuni relativi a quella provincia, comuni che deve prelevare dal database suddetto. Per fare ciò ho creato nel database una query RicercaComuniFillBy(Me.ComuniDataSet.Comuni, ProvSele) ProvSele è provincia selezionata.

    Come collego la query all’oggetto ComuniToolStripComboBox  per popolarlo?

    Se non ti dispiace potresti farmi qualche esempio basandoti sul codice che ti ho inviato.

    Grazie


    Giorgio

    venerdì 22 marzo 2013 15:28
  • Ciao Giorgio.

    Premesso che non ho ricevuto alcunché... (se mi dici dove l'hai inviato, magari è meglio),  mi devi spiegare perché non popoli il combo prendendo come datasource direttamente la tabella Province, visto che poi ti ritroveresti già disponibile la chiave pronta e disponibile per fare la selezione sulla RicercaComuniFillBy (che nome, mamma mia...), che questo sistema di riempimento è certamente più macchinoso di quello che ti ho proposto io e che poi, giocandotela bene, si potrebbe filtrare sui comuni una tabella già caricata invece di filtrare ogni volta (ma qui il giochetto è un po' più dipendente dall'architettura e dalla velocità del sistema, come anche dalla statistica del numero di interrogazioni medie e dalla velocità complessiva della rete)

    La query la puoi fare direttamente nell'handler dell'evento SelectedIndexChanged...

    Visto che però l'argomento potrebbe interessare anche ad altri, come anche altri potrebbero essere interessati ad intervenire pubblicamente (magari meno indegnamente di quanto sto facendo io), ti chiederei di continuare l'intervento sul forum.

    venerdì 22 marzo 2013 15:54
  • Ciao Giorgio58,

    Sto realizzando un programma con visual basic 2010 E.E. e mi sono bloccato in una ToolStripComboBox non riesco a popolare.

    Ho provato a scrivere il seguente codice:

    Private Sub ProvinciaToolStripComboBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ProvinciaToolStripComboBox.SelectedIndexChanged
            ProvSele = ProvinciaToolStripComboBox.SelectedItem
            
            ComuniToolStripComboBox.Items.Add(Me.ComuniTableAdapter.RicercaComuniFillBy(Me.ComuniDataSet.Comuni, ProvSele))

    ma non funziona.

    Qualcuno può darmi qualche spunto?

    Grazie

    Giorgio


    Giorgio

    altra alternativa utilizzare Linq con una select  , e passi poi il risultato della query alla proprietà DataSource del controllo ToolStripComboBox  , se mostri il codice interessato ti si può aiutare in maniera più mirata.

    Ciao.


    venerdì 22 marzo 2013 16:06
  • Il controllo ToolStripComboBox non ha la proprietà DataSource...

    venerdì 22 marzo 2013 16:17
  • Per Davide:

    mi devi spiegare perché non popoli il combo prendendo come datasource direttamente la tabella Province, visto che poi ti ritroveresti già disponibile la chiave pronta e disponibile per fare la selezione sulla RicercaComuniFillBy

    Semplice, perché nell’oggetto ToolStrip non è possibile inserire un ComboBox prelevata direttamente da una origine dati, avrei risolto il problema.

    Per Carmelo:

    altra alternativa utilizzare Linq con una select  , e passi poi il risultato della query alla proprietà DataSource del controllo ToolStripComboBox  

    ottimo suggerimento, ma non saprei come utilizzare Linq

    Vi allego il Codice:

    Private Sub Menu_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            'Popola combobox provincie
            CartDestArch = My.Settings.PercorsoArch
            lungCartDestArch = Len(CartDestArch)
            For Each foundFile As String In My.Computer.FileSystem.GetFiles(CartDestArch, FileIO.SearchOption.SearchTopLevelOnly, "*.taf")
                foundFile = Mid(foundFile, 1, Len(foundFile) - 4)
                provincia = UCase(Mid(foundFile, lungCartDestArch + 1))
                ProvincieToolStripComboBox.ComboBox.Items.Add(provincia)
            Next
        End Sub
    Private Sub ProvincieToolStripComboBox_SelectedIndexChanged(ByVal sender As Object, ByVal e As System.EventArgs) Handles ProvincieToolStripComboBox.SelectedIndexChanged
            'Leggo la provincia selezionata
            ProvSele = ProvincieToolStripComboBox.ComboBox.SelectedItem
            'Popola ComuniToolStripComboBox, ma non funzione
            ComuniToolStripComboBox.ComboBox.DataSource = Me.ComuniTableAdapter.RicercaComuniFillBy(Me.ComuniDataSet.Comuni, ProvSele)
            
        End Sub

    Grazie ad entrambi

    Giorgio

    venerdì 22 marzo 2013 17:34
  • Io ho popolato il toolstripcombobox da un dataset, con il codice allegato... Per cui non capisco come tu dica che non e' possibile.
    venerdì 22 marzo 2013 22:55
  • Scusa Davide, ma dov'è il codice allegato.


    Giorgio

    sabato 23 marzo 2013 13:05
  • Nella prima risposta che ho dato...

    Me.ToolStripComboBox1.ComboBox.DataSource = Me.BindingSource1 Me.ToolStripComboBox1.ComboBox.DisplayMember = "Descrizione" Me.ToolStripComboBox1.ComboBox.ValueMember = "Id"

    Ovviamente, ma sicuramente non c'è bisogno che lo dico, la cosa va adattata alla tua struttura dati, ed il BindingSource va riempito in maniera opportuna.

    lunedì 25 marzo 2013 08:23