mercoledì 16 settembre 2026

C# Filtrare i record di un DataTable in base alla selezione di un DataGridView

 In questo frammento di codice C# vediamo come, selezionando una riga di un controllo DataGridView, sia possibile recuperare il valore di un campo chiave e utilizzarlo per filtrare i record contenuti in un DataTable.

In questo modo vengono restituiti solamente i record che hanno nel campo chiave lo stesso valore dell'ID della riga selezionata.

Il DataGridView deve contenere una colonna ID nascosta, che utilizzeremo per effettuare la condizione di filtro.

Una volta applicato il filtro, i dati vengono ordinati e proiettati nei campi necessari, per poi essere assegnati come DataSource a un secondo DataGridView.

Aggiungere lo spazio dei nomi System.Linq





C#

private void datagridview1_SelectionChanged(object sender, EventArgs e)

 {

     try

     {

         if (datagridview1.CurrentRow == null || datagridview1.CurrentRow.IsNewRow)

             return;

         

         var IdRecord = datagridview1.CurrentRow.Cells["ColonnaIDNascosta"].Value;

         if (IdRecord  == null || IdRecord  == DBNull.Value)

             return;

          

         var righeFiltrate = dataTableDati.AsEnumerable()

                 .Where(r => (r.Field<int?>("CampoChiave ") ?? -1) == Convert.ToInt32(IdRecord ))

                 .OrderBy(r => Convert.ToString(r["CampoDataTable"]))

                 .Select(r => new

                 {

                     Campo = Convert.ToString(r["CampoA"]),

                     CampoB = Convert.ToString(r["CampoB "]),

                     CampoUnionte =

                         $"{Convert.ToString(r["CampoC "])}-{Convert.ToString(r["CampoD"])}",

                     CampioC = Convert.ToString(r["CampoE"])

                 })

                 .ToList();

 

         datagridview2.DataSource = righeFiltrate;

     }

     catch (Exception ex)

     {

          

         Messagebox.Show("Impossibile caricare i dati.", “Errore”, MessageBoxButtons.OK,

            MessageBoxIcon.Error);

     }

 }


Nessun commento: