+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 9 su 9

Filtro su Datagrid

  1. #1
    L'avatar di Kwisatz
    Kwisatz non è in linea Scolaretto
    Post
    118
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao a tutti...

    ho un datagrid popolato con una tabella Access, ho pensato di lasciare all'utente la possibilità di applicare un filtro generico tramite la compilazione di una casella testuale che conterrà la stringa da cercare in alcuni campi del datagrid. I risultati dovranno poi essere esposti dal datagrid dopo opportuno filtro.

    Ho trovato due soluzioni, la prima è questa e funziona (mi sembra) egregiamente:

                String Stringa_Filtro = "";
    
                if (this.txtRicerca.Text.Length > 0)
                    Stringa_Filtro = Stringa_Filtro + " AND Ragione_Sociale LIKE '" + this.txtRicerca.Text + "'";
    
                if (Stringa_Filtro.Length > 0)
                    Stringa_Filtro = Stringa_Filtro.Substring(4);
    
                anagraficaBindingSource.Filter = Stringa_Filtro;
    


    La second è invece questa ma comporta degli errori:

                    if (string.IsNullOrEmpty(txtRicerca.Text))
                        dataGridView1.DataSource = anagraficaBindingSource;
                    else
                    {
                        var query = from o in this.DatiDataSet.Anagrafica
                                    where o.Ragione_Sociale.Contains(txtRicerca.Text) 
                                    select o;
                        dataGridView1.DataSource = query.ToList();
                    }
    
    L'errore è il seguente:

    System.Data.StrongTypingException: 'Il valore della colonna 'Banca_Agenzia' nella tabella 'Anagrafica' è DBNull.'
    Non riesco a capirne la causa, non sto filtrando sul quel campo!
    Sapreste spiegarmene il motivo?

  2. #2
    Post
    2,272
    Blogs
    6
    Like Inviati  
    5
    Like Ricevuti  
    3
    Perchè NullValue della DataColumn del DataSet sarà impostato su "Throw exception"

    Imposta Empty o Nessuna
    ℹ️ Leggi di più su Fix ...

  3. #3
    L'avatar di Kwisatz
    Kwisatz non è in linea Scolaretto
    Post
    118
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da Fix Visualizza il messaggio
    Perchè NullValue della DataColumn del DataSet sarà impostato su "Throw exception"

    Imposta Empty o Nessuna
    Grazie Fix ma purtroppo non ho ancora risolto: i campi che scatenano l'eccezione non sono impostati su "Throw Exception" e nonostante abbia comunque più volte impostato il campo NullValue a "Empty" oppure "Nessuna" l'eccezione continua ad uscire.

  4. #4
    Post
    2,272
    Blogs
    6
    Like Inviati  
    5
    Like Ricevuti  
    3
    Oltre ad impostare i campi stringa su "Empty", al posto di "throw exception", per i campi di altro tipo (es: interi, date, etc..) che ti danno problemi, puoi utilizzare il metodo di estensione Field per recuperare i valori da colonne con campi DBNULL

    Quindi, dopo aver identificato le colonne che possono generare eccezioni, modifichi la query linq in modo da ricavare un nuovo tipo anonimo:


    var query = from o in this.DatiDataSet.Anagrafica
                where o.Ragione_Sociale.Contains(txtRicerca.Text) 
                select new {.CampoSicuro1 = o.CampoSicuro1,
                            .CampoSicuro2 = o.CampoSicuro2,
                            .CampoNullableInteger1 = o.Field(Of Integer?)("CampoNullableInteger1"),
                            .CampoNullableDate1 = o.Field(Of Date?)("CampoNullableDate1")};
    


    Agendo a monte potresti prevedere l'inserimento di valori predefiniti per i campi interi o date, in modo da non essere nulli.
    ℹ️ Leggi di più su Fix ...

  5. #5
    L'avatar di Kwisatz
    Kwisatz non è in linea Scolaretto
    Post
    118
    Like Inviati  
    0
    Like Ricevuti  
    0
    Grande Fix! Ottimo consiglio!

    Ho modificato tutti i Getter dei campi del file DatiDataSet.Designer.CS in questo modo:

    Per i campi stringa:
                [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
                [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")]
                public string Anag_Banca_Agenzia {
                    get {
                        try {
                            return ((string)(this[this.tableAnagrafica.Anag_Banca_AgenziaColumn]));
                        }
                        catch (global::System.InvalidCastException e) {
                            //throw new global::System.Data.StrongTypingException("Il valore della colonna \'Anag_Banca_Agenzia\' nella tabella \'Anagrafica\' è DBNull.", e);
                            return ("");
                        }
                    }
                    set {
                        this[this.tableAnagrafica.Anag_Banca_AgenziaColumn] = value;
                    }
                }
    
    E per i valori numeri invece:

                [global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
                [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Data.Design.TypedDataSetGenerator", "16.0.0.0")]
                public int Anag_Pagamento {
                    get {
                        try {
                            return ((int)(this[this.tableAnagrafica.Anag_PagamentoColumn]));
                        }
                        catch (global::System.InvalidCastException e) {
                            //throw new global::System.Data.StrongTypingException("Il valore della colonna \'Anag_Pagamento\' nella tabella \'Anagrafica\' è DBNull." + "", e);
                            return (0);
                        }
                    }
                    set {
                        this[this.tableAnagrafica_G.Anag_Pagamento_GColumn] = value;
                    }
                }
    
    E devo dire che sembra funzionare... tra l'altro non esce nemmeno errore quando inserisco nella stringa di ricerca i caratteri speciali ' oppure " cosa che il primo metodo invece faceva.

    L'altro consiglio della query "CampoSicuro" invece non l'ho capito... devo applicarmi di più...

  6. #6
    Sgrubak non è in linea Scribacchino
    Post
    590
    Like Inviati  
    10
    Like Ricevuti  
    9
    Quote Originariamente inviato da Kwisatz Visualizza il messaggio
    Ho modificato tutti i Getter dei campi del file DatiDataSet.Designer.CS in questo modo:
    Attenzione che editare quel file potrebbe essere inutile. La modifica del DataSet da wizard potrebbe cancellare le modifiche.
    Quando Fix suggerisce di "agire a monte", credo si riferisca all'impostare dei valori di default per i campi direttamente nel DB. Così, se poi ripeti il wizard, avrai le modifiche permanenti.

  7. #7
    Post
    2,272
    Blogs
    6
    Like Inviati  
    5
    Like Ricevuti  
    3
    Come ha scritto Sgrubak, per "monte", mi riferivo alla modifica direttamente sul DB.

    Sempre come scritto da Sgrubak (), non è consigliato modificare i file che vengono generati automaticamente dall'ambiente di sviluppo, perchè in caso di rigenerazione, tutte le modifiche applicate verrebbero eliminate.

    Quote Originariamente inviato da 15Kwisatz
    L'altro consiglio della query "CampoSicuro" invece non l'ho capito... devo applicarmi di più...
    Per "CampoSicuro", applicato all'esempio insieme al metodo .Field, intendevo un campo NON nullable, quindi sempre valorizzato.

    Per l'utilizzo combinato di DataTable e Linq, le strade (secondo me) sono 2:
    1. Utilizzi i metodi .Field e .SetField, consigliati dalla stessa Microsoft (Link1, Link2), per accedere ai valori dei campi che potrebbero essere DBNULL, considerato che supportano i tipi nullable.
    2. Editi il DB in modo da non avere campi DBNULL ma un valore di Default
    Ultima modifica di Fix; 23-02-2021 09:59 
    ℹ️ Leggi di più su Fix ...

  8. #8
    L'avatar di Kwisatz
    Kwisatz non è in linea Scolaretto
    Post
    118
    Like Inviati  
    0
    Like Ricevuti  
    0
    Grazie infinite per i preziosi consigli... ok, ora ho capito che di C# ne capisco veramente poco... ma voglio porre rimedio .


    Quote Originariamente inviato da Fix Visualizza il messaggio
    ...[*]Editi il DB in modo da non avere campi DBNULL ma un valore di Default[/LIST]
    Seguendo il consiglio di FIX devo pertanto aprire il DB Access ed impostare i valori di default, per i campi numerici nessun problema (Valore predefinito=0), ma per i campi stringa come posso fare? indico come Valore predefinito ="" ?

  9. #9
    Sgrubak non è in linea Scribacchino
    Post
    590
    Like Inviati  
    10
    Like Ricevuti  
    9
    Quote Originariamente inviato da Kwisatz Visualizza il messaggio
    indico come Valore predefinito ="" ?
    Esattamente.

    Segui le indicazioni della guida.

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Filtrare datagrid svuotato su richiesta altro datagrid relazionato
    Da Codice_da_Vinci nel forum Visual Basic .Net
    Risposte: 1
    Ultimo Post: 19-12-2014, 10:51
  2. Ricavare il valore selezionato da una datagrid Datagrid WPF
    Da kucaio nel forum Visual Basic .Net
    Risposte: 7
    Ultimo Post: 14-04-2013, 16:36
  3. Risposte: 24
    Ultimo Post: 20-03-2013, 18:51
  4. Filtro su Datagrid
    Da Folder nel forum Visual Basic .Net
    Risposte: 3
    Ultimo Post: 16-01-2012, 22:06
  5. Conteggio record datagrid dopo filtro.
    Da clock62 nel forum Visual Basic 6
    Risposte: 28
    Ultimo Post: 29-11-2008, 12:53