none
DbgridView evento: SelctionChanged RRS feed

  • Domanda

  • Sono nuovo dell'ambiente.
    Il mio problema e' questo.
    Applicazione Windows Form. Forma con due DbgridView
    Popolando la prima devo fare in modo che, quando finito, prenda il puntatore della prima riga ed esegua una query sul mio DB in modo
    da caricare la seconda.
    E' ovvio, che spostandomi con le frecce sulle altre righe si deve aggiornare la seconda DbgridView
    Uso l'evento SelectionChanged ma quando carico la prima dbgrid mi genera un errore.
    Avete mica una soluzione al problema ?
    Grazie.
    Saluti.
    Stefano.
    mercoledì 17 marzo 2010 13:06

Tutte le risposte

  • Ciao Stefano,
    sono iperneofita anche io, ma proprio ieri ho avuto la tua stessa necessità e ho risolto con le soluzioni proposte nei due link che ti posto

    http://www.visual-basic.it/articoli/adsIntroLINQToDataset.htm

    http://www.visual-basic.it/articoli/lbSimpleVSE_SQLE_App.htm

    logicamente, spero di aver capito bene il tuo problema.

    Saluti

    Salvatore
    mercoledì 17 marzo 2010 13:19
  • Ciao Stefano,
    sono iperneofita anche io, ma proprio ieri ho avuto la tua stessa necessità e ho risolto con le soluzioni proposte nei due link che ti posto

    http://www.visual-basic.it/articoli/adsIntroLINQToDataset.htm

    http://www.visual-basic.it/articoli/lbSimpleVSE_SQLE_App.htm

    logicamente, spero di aver capito bene il tuo problema.

    Saluti

    Salvatore

    Purtroppo non e' la soluzione adatta al mio problema.
    Io non uso il binding per 'definizione'
    Popolo le griglie con query che contengono puntatori numerici ad altre tabelle.

    Il problema mi si presenta su questo evento mentre viene caricata la dbgridview dalla sorgente dati.

     

     

    Private Sub LstAllocHeader_SelectionChanged(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles LstAllocHeader.SelectionChanged

    Piu' precisamente su Handles LstAllocHeader.SelectionChanged

    Bisognerebbe disabilitare l'evento durante il riempimento della griglia.
    Comunque grazie del tuo intervento.
    Saluti.
    Stefano.
    mercoledì 17 marzo 2010 13:43
  • Potresti prevedere un attributo di tipo boolean della form che ti indica che stai riempiendo la griglia.
    Prima di riempire la griglia (immagino facendo Add sulla collezione Rows) metti a true tale attributoad indicare che stai riempiendo la riga.
    Appena finito di riempire la riga lo rimetti a false.
    Nell'evento selection changed della griglia fai qualcosa solo se tale attributo è false.
    Altrimenti utilizzi il binding creandoti una collezione di oggetti (nello stesso modo in cui riempi la griglia ma facendo add su una lista) e metti in binding la lista.
    mercoledì 17 marzo 2010 18:02
    Moderatore
  • Potresti prevedere un attributo di tipo boolean della form che ti indica che stai riempiendo la griglia.
    Prima di riempire la griglia (immagino facendo Add sulla collezione Rows) metti a true tale attributoad indicare che stai riempiendo la riga.
    Appena finito di riempire la riga lo rimetti a false.
    Nell'evento selection changed della griglia fai qualcosa solo se tale attributo è false.
    Altrimenti utilizzi il binding creandoti una collezione di oggetti (nello stesso modo in cui riempi la griglia ma facendo add su una lista) e metti in binding la lista.

    Salve.
    Il problema sembra piu' complesso !
    Avevo gia' fatto molte DbGridView e, una volta caricate con i dati, eseguivo solo eventi Click e DoubleClick sulla griglia (Con la selezione completa della riga).
    Usando questi eventi non ho mai avuto problemi.
    Funziona tutto regolarmente.
    Ora, a me serve potermi muovere sulla griglia mediante i tasti up e down in modo da selezionare la riga precedente o successiva.
    Una volta selezionata la riga, dovrei caricare una seconda GridView mediante i parametri letti sulla prima GridView.
    Pensavo che l'evento SelectionChanged fosse quello corretto, ma forse non lo e'.

    Come posso fare per risolvere tale problema ?

    Grazie.
    Saluti.
    Stefano.
    giovedì 18 marzo 2010 09:38
  • Potresti prevedere un attributo di tipo boolean della form che ti indica che stai riempiendo la griglia.
    Prima di riempire la griglia (immagino facendo Add sulla collezione Rows) metti a true tale attributoad indicare che stai riempiendo la riga.
    Appena finito di riempire la riga lo rimetti a false.
    Nell'evento selection changed della griglia fai qualcosa solo se tale attributo è false.
    Altrimenti utilizzi il binding creandoti una collezione di oggetti (nello stesso modo in cui riempi la griglia ma facendo add su una lista) e metti in binding la lista.

    Salve.
    Il problema sembra piu' complesso !
    Avevo gia' fatto molte DbGridView e, una volta caricate con i dati, eseguivo solo eventi Click e DoubleClick sulla griglia (Con la selezione completa della riga).
    Usando questi eventi non ho mai avuto problemi.
    Funziona tutto regolarmente.
    Ora, a me serve potermi muovere sulla griglia mediante i tasti up e down in modo da selezionare la riga precedente o successiva.
    Una volta selezionata la riga, dovrei caricare una seconda GridView mediante i parametri letti sulla prima GridView.
    Pensavo che l'evento SelectionChanged fosse quello corretto, ma forse non lo e'.

    Come posso fare per risolvere tale problema ?

    Grazie.
    Saluti.
    Stefano.


    [RESOLVED]

    Probabilmente trattasi di una cattiva implementazione dell'evento SelectionChanged

    Io ho risolto cosi':

    Dopo aver caricato la prima GridView, ho inserito la seguente istruzione:

    AddHandler GridView.SelectionChanged, AddressOF CambioRiga

    Nella funzione CambiRiga, ho ricavato il puntatore necessario ad eseguire la seconda query per riempire la seconda

    GridView.

    Non e' molto elegante, ma almeno , spostandosi sulle righe della prima GridView viene aggiornata la seconda GridView

    Saluti.

    Stefano.

    venerdì 19 marzo 2010 10:58
  • Si, però così mfacendo, se riempi di nuovo la prima griglia ti scatta il selection changed a meno che tu non rimuova il gestore di evento prima di riempirla.

    Avresti ottenuto lo stesso risultato con il meccanismo che ti avevo proposto io.

    venerdì 19 marzo 2010 21:20
    Moderatore
  • Ciao a Tutti,

    non vedendo il codice non riesco a capire se è una cosa simile che mi era capitata, ma ti porto il mio esempio:

    Supponendo che nell'evento SelectionChange ci sia un riferimento alla riga corrente, o ad una determinata cella, questo va in errore quando la riga non esiste (ovvero in fase di caricamento) se però prima di eseguire la chiamata alla funzione di aggiornamento della seconda datagridview fai un controllo del tipo "If Riga is nothing then exit sub" risolvi il problema perchè salta la chiamata alla funzione che và in errore:

    faccio un esempio tipo:

     

    Private sub CambioRiga (byval sender, byval e .....) handles DataGridView.SelectionChanged

     If datagridview.currentrow is nothing then exit sub 'Controllo che esista una riga attuale

     RiempiDataGrid2(datagridview.currentrow) 'Funzione di riempimento della seconda DGV

    end sub

     

    in alternativa potresti usare un Try del tipo

     

    Private sub CambioRiga (byval sender, byval e .....) handles DataGridView.SelectionChanged

     Dim RigaCorrente as DataGridViewRow

     try

     RigaCorrente = DataGridView.currentrow

    catch ex as Exception

     Exit sub

    end try

     

     RiempiDataGrid2(RigaCorrente) 'Funzione di riempimento della seconda DGV

    end sub

     

     

    Io ho risolto così in molti casi di questo tipo.

    Facci Sapere.

     


    Iacobino Michele Il mio motto: L' 80% dei problemi dei PC sono tra seggiola e mouse, quindi viva gli utonti che ci danno lavoro.
    sabato 20 marzo 2010 09:05
  • Ciao a Tutti,

    non vedendo il codice non riesco a capire se è una cosa simile che mi era capitata, ma ti porto il mio esempio:

    Supponendo che nell'evento SelectionChange ci sia un riferimento alla riga corrente, o ad una determinata cella, questo va in errore quando la riga non esiste (ovvero in fase di caricamento) se però prima di eseguire la chiamata alla funzione di aggiornamento della seconda datagridview fai un controllo del tipo "If Riga is nothing then exit sub" risolvi il problema perchè salta la chiamata alla funzione che và in errore:

    faccio un esempio tipo:

     

    Private sub CambioRiga (byval sender, byval e .....) handles DataGridView.SelectionChanged

     If datagridview.currentrow is nothing then exit sub 'Controllo che esista una riga attuale

     RiempiDataGrid2(datagridview.currentrow) 'Funzione di riempimento della seconda DGV

    end sub

     

    in alternativa potresti usare un Try del tipo

     

    Private sub CambioRiga (byval sender, byval e .....) handles DataGridView.SelectionChanged

     Dim RigaCorrente as DataGridViewRow

     try

     RigaCorrente = DataGridView.currentrow

    catch ex as Exception

     Exit sub

    end try

     

     RiempiDataGrid2(RigaCorrente) 'Funzione di riempimento della seconda DGV

    end sub

     

     

    Io ho risolto così in molti casi di questo tipo.

    Facci Sapere.

     


    Iacobino Michele Il mio motto: L' 80% dei problemi dei PC sono tra seggiola e mouse, quindi viva gli utonti che ci danno lavoro.


    Ciao.

    Avete ragione un po' tutti ma non riesco a trovare altra soluzione.

    Il problema risiede sull'evento SelectionChanged della prima GridView proprio in ... Handles DataGridView.SelectionChanged

    Se scriviamo un evento Selectionchanged vuoto (senza codice), comunque durante l'esecuzione dell'istruzione  GridView.DataSource = Table viene scatenato l'errore in quanto presente l'evento SelectionChanged.

    Il problema risiede in qualche puntatore interno ancora non definito al momento del caricamento dati.

    Dove sbaglio ?

    Grazie dei vostri interventi.

    Saluti.

    Stefano.

     

    Anche se in questo evento non metti nulla,

    martedì 23 marzo 2010 13:16
  • Si, però così mfacendo, se riempi di nuovo la prima griglia ti scatta il selection changed a meno che tu non rimuova il gestore di evento prima di riempirla.

    Avresti ottenuto lo stesso risultato con il meccanismo che ti avevo proposto io.


    Ho provato ma una volta creata la foma con tutto dentro e aver eseguito tutto il setup iniziale, rieseguendo GridView.DataSource = Table

    funziona tutto perfettamente. Probabilmente perche' e' tutto inizializzato correttamente dalla prima volta.

    Se dovessi essere sincero, (non vorrei peccare di presunzione in quanto sono molto ignorante di DOT NET) secondo me, l'evento SelectionChanged non e' perfettamente a posto. Infatti, per l'oggetto ComboBox hanno previsto la SelectionCommitted che fa proprio il mestiere giusto ! Durante il caricamento della ComboBox l'evento SelectionCommitted non viene scatenato fino a quando la combo non e' stata riempita totalmente.

    Grazie del tuo intervento.

    Saluti.

    Stefano.

     

     

    martedì 23 marzo 2010 13:33
  • Scusate, anche se in ritardo, ma usare in BindingSource con l'evento  PositionChanged?

    Scusate se non ho capito ca..ppero.

     

    mercoledì 28 aprile 2010 15:45
  • Ciao,

    qui di seguito ciò che hai chiesto

    'quando inizia a caricare la tabella
    RemoveHandler LstAllocHeader.SelectionChanged, AddressOf LstAllocHeader_SelectionChanged
    'quando finisce di caricare la tabella
    AddHandler LstAllocHeader.SelectionChanged, AddressOf LstAllocHeader_SelectionChanged
    spero che sia la risposta alla tua richiesta
    mercoledì 22 maggio 2013 12:29