none
Popolare una combobox inserita in una colonna di un DataGridView

    Domanda

  • Ho realizzato un'applicazione con VB 2010 Express Edition, ma ho trovato difficoltà nel popolare una ComboBox inserita in una colonna di un DataGrid View. Ho il seguente codice:
    Cartella = Trim(My.Settings.Percorso)
    ElencoFattureDataGridView.Rows.Clear()
    FileOpen(1, Cartella & "FATTURAZIONE.DAT", OpenMode.Random, , , Len(Fatturazione))
     For nf = 1 To NumFattReg
     FileGet(1, Fatturazione, nf)
     RecClie = fatturazione.RECLIEN
     NumFat = fatturazione.NUMF
     datafat = fatturazione.DATAF
     NS(1) = fatturazione.NSCHEDA1
     NS(2) = fatturazione.NSCHEDA2
     NS(3) = fatturazione.NSCHEDA3
     NS(4) = fatturazione.NSCHEDA4
     NS(5) = fatturazione.NSCHEDA5
    ElencoFattureDataGridView.Rows.Add(NumFat, datafat, RecClie, 'Colonna ComboBox da popolare con il valore di NS(n)')
    Next (nf)
    
    FileClose(2)
    
    

    Come si può notare ho un DataGridView con 4 colonne, la quarta colonna è una ComboBox che vorrei popolare con i valori della variabile NS(n). Qual'è il codice da utilizzare?

    Grazie


    Giorgio

     

    lunedì 27 dicembre 2010 12:33

Risposte

  • Ciao Giorgio,

    avrei una considerazione sul uso del combobox, da quanto vedo non hai lo stesso set di dati ma invece uno diverso per ogni riga, quindi non si puo impostare un'unico per la colonna. Dovresti quindi impostare il sorgente a livello di casella del GridView.

    Prova cosi:

    ...

    DataGridView1.Rows.Add("valore finta della prima riga")

    Dim cellaTendina As DataGridViewComboBoxCell = New DataGridViewComboBoxCell()

    cellaTendina.DataSource = NS

    DataGridView1.CurrentRow.Cells("Column2") = cellaTendina

     ...

    In parole aggiungi le valori delle casele di testo regolarmente e lasci la combo dopo. Quindi instanzi una nuova cella di tipo combo, metti il sorgente e lo imposti a quella appena creata ;-) 

    Spero ti è chiaro, altrimenti chiedi pure.

    Saluti, Daniel.


    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.

    giovedì 30 dicembre 2010 15:05
  • Ciao Giorgio,

    Mi sorge il dubbio che hai nel tuo array delle posizioni vuote, potresti controllare se ad esempio NS(0)=Nothing ?

    Inoltre, in modo design della griglia, sulla colonna a tendina imposta la proprietà  AutosizeMode a Fill (potrebbe causare se il contenuto della cella va oltre l'area di visibilità impostata per la griglia) e prova trascinare il limite della grilia in modo da rendere visibile tutto. 

    Saluti, Daniel.


    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.
    lunedì 3 gennaio 2011 16:39
  • Ciao Giorgio,

    io ho disegnato la mia griglia come ti ho suggerito nel post precedente e non ho alcun errore, quindi vedi te se magari c'è qualcosa da smatnettare sulle proprietà, lato visualizzazione.

    Invece per impostare un valore di "default" dopo aver creato la griglia, esegui questo pezzo per impostare la prima della lista come valore predefinita.

     For Each dgvr As DataGridViewRow In DataGridView1.Rows

         Dim cella As DataGridViewComboBoxCell = dgvr.Cells(1)

         cella.Value = cella.Items(0)

     Next

    Saluti, Daniel.


    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.
    lunedì 3 gennaio 2011 17:58

Tutte le risposte

  • Ciao Giorgio,

    innanzitutto non si capisce se usi WebForms o WinForms

    Per la Combobox invece, non ti basta valorizzare l'esspresione NS(n) = valore e l'esito (true/false) assegnarlo ad una variabile che starebbe come il quarto parametro? 

    Rimaniamo in attesa di un tuo riscontro.

    Saluti, Daniel.

    P.S. Ma perche usi ancora le runtime di VB6 per accedere ai file? Discussione simile qui.


    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.
    lunedì 27 dicembre 2010 15:31
  • Ciao Daniel,

    uso WinForms.

    In merito alla ComboBox, ho capito che non posso assegnarle i valori di NS(n) direttamente, per questo che vi ho chiesto un aiuto.

    Uso ancora il runtime di VB6 per accedere ai file in quanto non ho ancora dimestichezza con base dati basata su File System.

    Saluti


    Giorgio
    lunedì 27 dicembre 2010 17:26
  • Ciao Giorgio,

    forse non mi sono spiegato bene oppure non capisco dal codice la tua intenzione, quindi riprovo.

    Per valorizzare un combobox ti serve un valore boolean (true/false ), vero?

    Ti stavo suggerendo di ottenerla facendo il confronto di NS(n) con un certo valore (che basandomi sul codice che hai postato non saprei dirti da dove prenderlo, magari tu conosci meglio le tue esigenze, quindi lo sparo cosi)

    Quindi in codice:

     

    Dim valorecombo As Boolean
    
    If NS(n) = valore Then valorecombo =true
    
    Else
    
    valorecombo =false
    
    End If
    
    Se non l'ho capito io bene, non esitare a ricontattarci.

    Per quanto le runtime ti suggerisco caldamente di leggere Guida in linea per gli utenti di Visual Basic 6.0 , vengono illustrate le differenze tra la versione 6.0 e la versione corrente di Visual Basic.

    Saluti e Buon Anno!

    Daniel.


    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.
    martedì 28 dicembre 2010 08:48
  • Ciao Daniel,

    scusami, ma questi DataGridView non gli ho ancora digeriti.

    Ti spiego meglio ciò che vorrei fare:

    Ho un file random "Fatturazione.dat" dove sono memorizzati una serie di record, ogni record contiene  la variabile NS(n) (cinque volte) questi cinque valori li vorrei inserire in una colonna combobox di DataGridView (che ho chiamato "NumSchedaAcconto"), ho scritto il seguente codice per popolare il DataGridView:

    ElencoFattureDataGridView.Rows.Add(NumFat, datafat, RecClie, ?)
    Manca il quarto parametro (?) ho provato ad inserire il seguente codice, ma ha dato un errore:

    ElencoFattureDataGridView.Rows.Add(NumFat, datafat, RecClie,NumSchedaAcconto.DataGridView.Rows.Add(NS(1),NS(2),NS(3).....)
    
    

    Nel tuo esempio mi scrivi di confrontare NS(n) con certo valore, ma con capisco quale valore, inoltre dal tuo esempio non capisco se il quarto parametro sia "valorecombo".

    Ti ringrazio (sopratutto per la pazienza) e ti auguro un felice anno nuovo.


     


    Giorgio
    martedì 28 dicembre 2010 20:57
  • Ciao Giorgio,

    scusami, mi sfugge il motivo per quale ho letto checkbox anziché combobox, hai ragione.

    Riprendo, per il combobox(tendina) il sorgente dati dev'essere un array di stringhe, cioè il tuo NS. Quindi ti basta assegnarlo cosi:

    <nomedellacollonacontenente>.DataSource = NS

    e ignorarlo come parametro nel momento in quale aggiungi delle nuove righe alla griglia.

    Ti ho fatto questo esempio da seguire:

        Dim stringhe(5) As String
        stringhe(0) = "0"
        stringhe(1) = "10"
        stringhe(2) = "20"
        stringhe(3) = "30"
        stringhe(4) = "40"
    
        Column2.DataSource = stringhe 'Column2 è il nome della collona a tendina
    
        DataGridView1.Rows.Add("valore finta della prima riga")
    

    Dimmi se riesci implementarlo.

    Saluti e scusami per la confusione.


    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.
    mercoledì 29 dicembre 2010 08:51
  • Ciao Daniel,

    adesso è molto più chiaro, ma segnala un errore:

    System.ArgumentException: Valore di DataGridViewComboBoxCell non valido.

    Ho aggiornato il codice in questo modo:

    Cartella = Trim(My.Settings.Percorso)
    ElencoFattureDataGridView.Rows.Clear()
    FileOpen(1, Cartella & "FATTURAZIONE.DAT", OpenMode.Random, , , Len(Fatturazione))
     For nf = 1 To NumFattReg
     FileGet(1, Fatturazione, nf)
     RecClie = fatturazione.RECLIEN
     NumFat = fatturazione.NUMF
     datafat = fatturazione.DATAF
     NS(1) = fatturazione.NSCHEDA1
     NS(2) = fatturazione.NSCHEDA2
     NS(3) = fatturazione.NSCHEDA3
     NS(4) = fatturazione.NSCHEDA4
     NS(5) = fatturazione.NSCHEDA5
    NumSchedaAcconto.DataSource = NS
    
    ElencoFattureDataGridView.Rows.Add(NumFat, datafat, RecClie)
    Next (nf)
    
    FileClose(2)
    

    Dove sbaglio?

    Grazie


    Giorgio
    mercoledì 29 dicembre 2010 18:24
  • Ciao Giorgio,

    avrei una considerazione sul uso del combobox, da quanto vedo non hai lo stesso set di dati ma invece uno diverso per ogni riga, quindi non si puo impostare un'unico per la colonna. Dovresti quindi impostare il sorgente a livello di casella del GridView.

    Prova cosi:

    ...

    DataGridView1.Rows.Add("valore finta della prima riga")

    Dim cellaTendina As DataGridViewComboBoxCell = New DataGridViewComboBoxCell()

    cellaTendina.DataSource = NS

    DataGridView1.CurrentRow.Cells("Column2") = cellaTendina

     ...

    In parole aggiungi le valori delle casele di testo regolarmente e lasci la combo dopo. Quindi instanzi una nuova cella di tipo combo, metti il sorgente e lo imposti a quella appena creata ;-) 

    Spero ti è chiaro, altrimenti chiedi pure.

    Saluti, Daniel.


    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.

    giovedì 30 dicembre 2010 15:05
  • Ciao Daniel,

    ho provato il tuo suggerimento, ma continua a segnalare l'errore:

    Si è verificata la seguente eccezione in DataGridView:

    System.ArgumentException: Valore di DataGridViewComboBoxCell non valido.

    Per sostituire questa finestra di dialogo predefinita, gestire l'Evento DataError.

    Ho gestito l'errore con l'evento DataError, segnalandomi l'errore: Formatting, Display.

    Non pensavo fosse così complesso popolare una ComboBox all'interno di un DataGridView

    Saluti


    Giorgio
    lunedì 3 gennaio 2011 15:28
  • Ciao Giorgio,

    Mi sorge il dubbio che hai nel tuo array delle posizioni vuote, potresti controllare se ad esempio NS(0)=Nothing ?

    Inoltre, in modo design della griglia, sulla colonna a tendina imposta la proprietà  AutosizeMode a Fill (potrebbe causare se il contenuto della cella va oltre l'area di visibilità impostata per la griglia) e prova trascinare il limite della grilia in modo da rendere visibile tutto. 

    Saluti, Daniel.


    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.
    lunedì 3 gennaio 2011 16:39
  • Hai ragione NS(0)= nothing, ho corretto il tutto modificando il codice in questo modo:

    Cartella = Trim(My.Settings.Percorso)
        ElencoFattureDataGridView.Rows.Clear()
            FileOpen(1, Cartella & "FATTURAZIONE.DAT", OpenMode.Random, , , Len(fatturazione))
        For nf = 1 To NumFattReg
          FileGet(1, fatturazione, nf)
          RecClie = fatturazione.RECLIEN
          NumFat = fatturazione.NUMF
          datafat = fatturazione.DATAF
    
          NS(0) = fatturazione.NSCHEDA1
          NUMACC(0) = fatturazione.NUMACC1
          DESCPREST(0) = Trim(fatturazione.DESCPRESTAZ1)
          Acconto(0) = fatturazione.IMPORTO1F
          NS(1) = fatturazione.NSCHEDA2
          NUMACC(1) = fatturazione.NUMACC2
          DESCPREST(1) = Trim(fatturazione.DESCPRESTAZ2)
          Acconto(1) = fatturazione.IMPORTO2F
          NS(2) = fatturazione.NSCHEDA3
          NUMACC(2) = fatturazione.NUMACC3
          DESCPREST(2) = Trim(fatturazione.DESCPRESTAZ3)
          Acconto(2) = fatturazione.IMPORTO3F
          NS(3) = fatturazione.NSCHEDA4
          NUMACC(3) = fatturazione.NUMACC1
          DESCPREST(3) = Trim(fatturazione.DESCPRESTAZ4)
          Acconto(3) = fatturazione.IMPORTO4F
          NS(4) = fatturazione.NSCHEDA5
          NUMACC(4) = fatturazione.NUMACC5
          DESCPREST(4) = Trim(fatturazione.DESCPRESTAZ5)
          Acconto(4) = fatturazione.IMPORTO5F
    
          PerCI = fatturazione.CONTRIINTE
          PerIVA = fatturazione.IVAF
          DESPE = Trim(fatturazione.DESSPESE)
          ImpSpeEsenti = fatturazione.SPESEF
          PerRA = fatturazione.RITACC
          
     TipologiaCliente = fatturazione.TIPOCLIENTE
          TipAtt(0) = fatturazione.TIPOATTIVITA1
          AREASP(0) = fatturazione.AREASPECIAL1
          TipAtt(1) = fatturazione.TIPOATTIVITA2
          AREASP(1) = fatturazione.AREASPECIAL2
          TipAtt(2) = fatturazione.TIPOATTIVITA3
          AREASP(2) = fatturazione.AREASPECIAL3
          TipAtt(3) = fatturazione.TIPOATTIVITA4
          AREASP(3) = fatturazione.AREASPECIAL4
          TipAtt(4) = fatturazione.TIPOATTIVITA5
          AREASP(4) = fatturazione.AREASPECIAL5
         
         FileOpen(2, Cartella & "Utenti.dat", OpenMode.Random, , , Len(Utenti))
          FileGet(2, Utenti, RecClie)
          Nominativo = Trim(Utenti.nominativo)
          CodiceFiscale = Trim(Utenti.CF)
          PartitaIVA = Trim(Utenti.PI)
          FileClose(2)
    
                ElencoFattureDataGridView.Rows.Add(NumFat, datafat, RecClie, Nominativo, "", "", PerCI, PerIVA, ImpSpeEsenti, PerRA, TipologiaCliente, "", "")
          
          For nacc = 0 To 4
            ImpTotale += Acconto(nacc)
            If Acconto(nacc) > 0 Then
              NumSchedaAcconto.Items.Add(NS(nacc))
              ImportoFatt.Items.Add(Acconto(nacc))
              TipolAttiv.Items.Add(TipAtt(nacc))
              AreaSpec.Items.Add(AREASP(nacc))
            End If
          Next
    
    Next (nf)
        FileClose(1)

    Come puoi notare ho aggiunto altre colonne nel DataGrid View tra cui altre tre ComboBox.

    Tutto funziona perchè ho gestito l'errore con l'evento DataError, evitando la visualizzazione della finestra di errore, ma comunque l'errore esiste e non capisco da cosa è causato, è forse una questione di formattazione?.

    Inoltre non capisco perchè le varie ComboBox non visualizzano il 1° elemento della lista, non è automatico? Qual'è il codice per visualizzare il 1° elemento di una ComboBox.

    Grazie ancora per l'aiuto


    Giorgio
    lunedì 3 gennaio 2011 17:13
  • Ciao Giorgio,

    io ho disegnato la mia griglia come ti ho suggerito nel post precedente e non ho alcun errore, quindi vedi te se magari c'è qualcosa da smatnettare sulle proprietà, lato visualizzazione.

    Invece per impostare un valore di "default" dopo aver creato la griglia, esegui questo pezzo per impostare la prima della lista come valore predefinita.

     For Each dgvr As DataGridViewRow In DataGridView1.Rows

         Dim cella As DataGridViewComboBoxCell = dgvr.Cells(1)

         cella.Value = cella.Items(0)

     Next

    Saluti, Daniel.


    Questo contenuto è distribuito “as is” e non implica alcuna responsabilità da parte di Microsoft. L'azienda offre questo servizio gratuitamente, allo scopo di aiutare gli utenti e farli aumentare la conoscenza sui prodotti e le tecnologie Microsoft.
    lunedì 3 gennaio 2011 17:58