+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 18

vbnet 2010 Rimuovere righe in datagridview

  1. #1
    ljt
    ljt non è in linea Scolaretto
    Post
    240
    Like Inviati  
    0
    Like Ricevuti  
    0
    Salve e rieccomi con una nuova domanda.
    Sto cercando di rimuovere delle righe da una datgagridview che non mi interessano in base ad un campo di ricerca inserito dall'utente.
    Ecco il codice:
    For Each Riga As DataGridViewRow In dgv.Rows
          Dim stringa As String = Riga.Cells(3).Value.ToString
                    If stringa.Contains(txtRicerca.Text) = True Then
                        dgv(3, Riga.Index).Style.BackColor = Color.LightGreen
                    Else
                        dgv.Rows.Remove(Riga)
                    End If
          Next
    
    La variabile stringa contiene il valore da ricercare inserito dall'utente.
    Vorrei che il codice eliminasse tutte le righe che non contengono il valore da ricerca e lasciasse colorata di verde la cella numero 3.
    Fino a che non trova l'occorrenza il codice funziona poi elimina una riga si e una no.

    Dove devo agire per correggere il codice?

    Grazie

  2. #2
    L'avatar di sistemista
    sistemista ora è in linea Topo di biblioteca
    Post
    2,854
    Like Inviati  
    7
    Like Ricevuti  
    0
    se i dati provengono da una query di un DB allora devi procedere in maniera diversa,altrimenti dicci da dove prelievi i dati che inserisci nella datagridview.
    ℹ️ Leggi di più su sistemista ...

  3. #3
    L'avatar di _alka_
    _alka_ non è in linea Very Important Person
    Post
    1,347
    Like Inviati  
    0
    Like Ricevuti  
    14
    Quote Originariamente inviato da ljt Visualizza il messaggio
    Salve e rieccomi con una nuova domanda.
    Fino a che non trova l'occorrenza il codice funziona poi elimina una riga si e una no.
    Secondo me, non dovresti rimuovere righe all'interno del ciclo in cui stai enumerando l'insieme delle righe stesse.

    Salvati in una lista le righe da eliminare e, appena terminato di individuare quali sono, fai un ciclo sugli elementi inseriti nella lista rimuovendoli dalla griglia.

    Ciao!
    ℹ️ Leggi di più su _alka_ ...

  4. #4
    L'avatar di AntonioG
    AntonioG non è in linea Moderatore Globale Ultimo blog: Commodore 64 e Codemotion
    Post
    17,346
    Blogs
    5
    Like Inviati  
    5
    Like Ricevuti  
    30
    Oppure utilizza un ciclo con un contatore (utilizza l'index) e fallo partire dall'ultimo elemento verso il primo, contando al contrario.
    ℹ️ Leggi di più su AntonioG ...

  5. #5
    Post
    1,863
    Blogs
    21
    Like Inviati  
    13
    Like Ricevuti  
    11
    credo vada bene anche Linq invece dei cicli
    'NON PROVATO

      Dim aIE = From x As DataGridViewRow In dvg.Rows _
                     Where x.Cells.Item(3).Value().Contains(txtRicerca.Text)
     
     
    With dvg.Rows
           .Clear()
           .AddRange(aIE.ToArray)
     End With
    
    va da se che se si vuole fare una nuova ricerca sui dati originali questi vanno salvati da qualche parte
    e la query linq va fatta su questi e non sulle rows della datagrid attuali perchè già mancanti delle righe eliminate
    dall'applicazione del filtro precedente

    EDIT
    molto probabilmente si potrebbe fare anche senza linq e cicli
    e senza salvarsi i dati originali senza filtro sfruttando istruzioni tipo :
    (dgv.DataSource as DataTable).DefaultView.RowFilter=....
    
    Ultima modifica di sspintux; 18-12-2020 22:26 
    ℹ️ Leggi di più su sspintux ...

  6. #6
    ljt
    ljt non è in linea Scolaretto
    Post
    240
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da sistemista Visualizza il messaggio
    se i dati provengono da una query di un DB allora devi procedere in maniera diversa,altrimenti dicci da dove prelievi i dati che inserisci nella datagridview.
    Grazie a tutti per il vostro aiuto.

    Intanto rispondo a Sistemista.

    I dati non sono ripresi da un database, ma da un file di testo (txt).

    Grazie

  7. #7
    L'avatar di SirJo
    SirJo non è in linea Scolaretto
    Post
    50
    Like Inviati  
    5
    Like Ricevuti  
    2
    AntonioG ti ha dato la risposta giusta.
    NON devi usare un ForEach ma scorrere i record tramite un indice, e poi DEVI iniziare dall'ultimo record verso il primo

  8. #8
    ljt
    ljt non è in linea Scolaretto
    Post
    240
    Like Inviati  
    0
    Like Ricevuti  
    0
    Mi sono "divertito" a fare delle prove e ho trovato una soluzione alternativa.
    Considerando che la DGV viene popolata da un file txt perché non rileggere il file txt inserendo solo le righe che contengono il valore da ricercare nella DGV?
    Brevemente:
    Pulisco la DGV
    Leggo il file TXT
    Popolo la DGV solo con le righe che contengono il valore da ricercare.

    Facendo così non sarà la soluzione più veloce, ma funziona.

    Grazie a tutti per il vostri preziosi consigli.

  9. #9
    ljt
    ljt non è in linea Scolaretto
    Post
    240
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da AntonioG Visualizza il messaggio
    Oppure utilizza un ciclo con un contatore (utilizza l'index) e fallo partire dall'ultimo elemento verso il primo, contando al contrario.
    Anche se ho risolto in maniera alternativa ho comunque seguito il tuo consiglio che, ovviamente, funziona.
    Posto il codice:
    Dim conta As Integer = dgv.RowCount - 1
    
            For i = conta To 1 Step -1 
                If dgv.Item(3, i).Value.ToString.Contains(txtRicerca.Text) Then
                    dgvCaricaDestinatari.Item(3, i).Style.BackColor = Color.LightGreen
                Else
                    dgvCaricaDestinatari.Rows.Remove(dgvCaricaDestinatari.Rows(i))
                End If
            Next
    
    Grazie mille

  10. #10
    ljt
    ljt non è in linea Scolaretto
    Post
    240
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da sspintux Visualizza il messaggio
    credo vada bene anche Linq invece dei cicli
    'NON PROVATO

      Dim aIE = From x As DataGridViewRow In dvg.Rows _
                     Where x.Cells.Item(3).Value().Contains(txtRicerca.Text)
     
     
    With dvg.Rows
           .Clear()
           .AddRange(aIE.ToArray)
     End With
    
    va da se che se si vuole fare una nuova ricerca sui dati originali questi vanno salvati da qualche parte
    e la query linq va fatta su questi e non sulle rows della datagrid attuali perchè già mancanti delle righe eliminate
    dall'applicazione del filtro precedente

    EDIT
    molto probabilmente si potrebbe fare anche senza linq e cicli
    e senza salvarsi i dati originali senza filtro sfruttando istruzioni tipo :
    (dgv.DataSource as DataTable).DefaultView.RowFilter=....
    
    Non volendo lasciare niente in sospeso ho guardato anche il tuo consiglio.
    Il seguente codice non mi è del tutto chiaro perché contiene dei comandi che non ho mai usato:

    Dim aIE = From x As DataGridViewRow In dvg.Rows Where x.Cells.Item(3).Value().Contains(txtRicerca.Text)
    
    In pratica popola la tabella solo con il valori contenuti nel campo txtricerca.text?

    Grazie

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Creazione Form dinamica [VBNET 2010]
    Da ljt nel forum Visual Basic .Net
    Risposte: 2
    Ultimo Post: 25-05-2019, 12:52
  2. [vbnet 2010] Problema visualizzazione dati su dgv
    Da ljt nel forum Visual Basic .Net
    Risposte: 10
    Ultimo Post: 09-04-2019, 18:04
  3. Risposte: 5
    Ultimo Post: 28-10-2015, 20:12
  4. Errori dopo aggiornamento VBNET 2010 EXPRESS SP1
    Da Sn0rky nel forum Visual Basic .Net
    Risposte: 6
    Ultimo Post: 25-05-2012, 23:23
  5. [VBNET] cancellazione record da datagridview
    Da fabiof nel forum Visual Basic .Net
    Risposte: 6
    Ultimo Post: 28-04-2008, 10:39