domenica 22 settembre 2019

.Net DatagridView con checkbox seleziona tutto tramite VB.Net e C#

Si riporta l'articolo scritto per il sito https://www.iprogrammatori.it/articoli/programmazione/art_net-datagridview-con-checkbox-selezionat_1635.aspx



In questo articolo vedremo come realizzare nelle nostre applicazioni di tipo “Windows Application” la possibilità di dotare il controllo DatagridView, un controllo Checkbox posizionato nell’intestazione che permette di selezionare e deselezionare le varie righe.
Inoltre tramite un pulsante andremo a visualizzare a video i record selezionati.
I vari esempi di codice sono tutti tramite i linguaggi di programmazione più usati del .Net, in particolare di Visual Basic Net e C#.
Dopo aver selezionato un progetto di tipo “Desktop” tramite il linguaggio di proprio interesse, inserire nella finestra, un controllo datagridview ed un pulsante, il tutto come mostrato in figura 1.
Il DatagridView, dovrà contenere una colonna di tipo “DataGridViewCheckBoxColumn”.


Figura 1 – La finestra di esempio

Stesura di codice

Ora dobbiamo scrivere il codice per implementare il controllo DatagridView con l’intestazione di tipo Checkbox e visualizzare a video i valori selezionati.
Passiamo in visualizzazione codice e scriviamo il codice per realizzare quanto detto.
Scriviamo la funzione che permette di selezionare e deselezionare le varie checkebox di ogni riga.
In questo modo quando si farà click sul controllo checkbox posto nell’intestazione verificherà se togliere o no la spunta.
Qui di seguito la funzione per entrambi i linguaggi.



VB.Net

Private Sub checkboxIntestazione_CheckedChanged(ByVal sender As Object, ByVal e As EventArgs)

        DtgDati.BeginEdit(True)

        Dim checkTutti As CheckBox = CType(sender, CheckBox)

        Dim selezionaSiNo As Boolean = checkTutti.Checked

        Dim righeSelezionate = (From row In DtgDati.Rows.OfType(Of DataGridViewRow)() Where row.Cells("Nome").Value IsNot Nothing AndAlso Not String.IsNullOrEmpty(row.Cells("Cognome").Value.ToString()) Select row).ToList()

 

        For Each Elemento In righeSelezionate

            Dim chk As DataGridViewCheckBoxCell = CType(Elemento.Cells(0), DataGridViewCheckBoxCell)

            chk.Value = selezionaSiNo

        Next

 

        DtgDati.EndEdit()

    End Sub

 

 

C#

   void checkboxIntestazione_CheckedChanged(object sender, EventArgs e)

        {

            DtgDati.BeginEdit(true);

            CheckBox checkTutti = (CheckBox)sender;

            bool selezionaSiNo = checkTutti.Checked;

 

            var righeSelezionate = (from row in DtgDati.Rows.OfType<DataGridViewRow>()

                                    where

                                          row.Cells["Nome"].Value != null && !string.IsNullOrEmpty(row.Cells["Cognome"].Value.ToString())

                                    select row).ToList();

 

            foreach (var Elemento in righeSelezionate)

            {

                DataGridViewCheckBoxCell chk = (DataGridViewCheckBoxCell)Elemento.Cells[0];

 

                chk.Value = selezionaSiNo;

 

            }

            DtgDati.EndEdit();

        }


Ora dobbiamo scrivere la funzione che permette di aggiungere all’intestazione del controllo Datagriview il controllo Checkbox e richiamare la funzione precedente, tramite l’evento di mettere o togliere la spunta.
Il codice di facile comprensione, riguarda la possibilità di creare un controllo checkbox, impostare le dimensioni ed il posizionamento.
Qui di seguito le suddette operazioni per entrambi i linguaggi di programmazione.


 

VB.Net

Private Sub VisualizzaCheckAll()

        Dim rect As Rectangle = DtgDati.GetCellDisplayRectangle(0, -1, True)

        rect.Y = 3

        rect.X = rect.X + (rect.Width / 2) - 7

        Dim checkboxIntestazione As CheckBox = New CheckBox()

        checkboxIntestazione.Name = "checkboxIntesazione"

        DtgDati(0, 0).ToolTipText = "Seleziona tutto."

        checkboxIntestazione.Size = New Size(18, 18)

        checkboxIntestazione.Location = rect.Location

        AddHandler checkboxIntestazione.CheckedChanged, AddressOf checkboxIntestazione_CheckedChanged

        DtgDati.Controls.Add(checkboxIntestazione)

    End Sub

 

C#

  private void VisualizzaCheckAll()

        {

            Rectangle rect = DtgDati.GetCellDisplayRectangle(0, -1, true);

            // Imposto la posizione

            rect.Y = 3;

            rect.X = rect.X + (rect.Width / 2) - 7;

            CheckBox checkboxIntestazione = new CheckBox();

            checkboxIntestazione.Name = "checkboxIntesazione";

            DtgDati[0, 0].ToolTipText = "Seleziona tutto.";

            checkboxIntestazione.Size = new Size(18, 18);

            checkboxIntestazione.Location = rect.Location;

            checkboxIntestazione.CheckedChanged += checkboxIntestazione_CheckedChanged;

          

            DtgDati.Controls.Add(checkboxIntestazione);

        }

Ora dobbiamo scrivere il codice per il caricamento dei dati nel controllo Datagridview
Qui di seguito il codice per creare delle righe con alcuni dati, in particolare saranno due colonne che rappresentano il nome e cognome.
Il codice si troverà nell’evento load della form, in modo che appena si avvia verranno caricati.



VB.Net

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

        Try

            VisualizzaCheckAll()

            Dim Dati As DataTable = New DataTable()

            Dim ColonnaNome As DataColumn = New DataColumn("Nome")

            Dim ColonnaCognome As DataColumn = New DataColumn("Cognome")

            Dati.Columns.Add(ColonnaNome)

            Dati.Columns.Add(ColonnaCognome)

            Dim riga As DataRow = Dati.NewRow()

            riga("Nome") = "Emanuele"

            riga("Cognome") = "Mattei"

            Dati.Rows.Add(riga)

            riga = Dati.NewRow()

            riga("Nome") = "Luigi"

            riga("Cognome") = "Cristaldi"

            Dati.Rows.Add(riga)

            DtgDati.DataSource = Dati

        Catch ex As Exception

            MessageBox.Show("Errore: " & ex.Message)

        End Try

    End Sub

 

 

C#

private void Form1_Load(object sender, EventArgs e)

        {

 

            try

            {

 

                VisualizzaCheckAll();

                DataTable Dati = new DataTable();

                DataColumn ColonnaNome = new DataColumn("Nome");

                DataColumn ColonnaCognome = new DataColumn("Cognome");

                Dati.Columns.Add(ColonnaNome);

                Dati.Columns.Add(ColonnaCognome);

 

                DataRow riga = Dati.NewRow();

                riga["Nome"] = "Emanuele";

                riga["Cognome"] = "Mattei";

                Dati.Rows.Add(riga);

 

                  riga = Dati.NewRow();

                riga["Nome"] = "Luigi";

                riga["Cognome"] = "Cristaldi";

                Dati.Rows.Add(riga);

                DtgDati.DataSource = Dati;

 

 

 

 

 

            }

            catch (Exception ex)

            {

                MessageBox.Show("Errore: " + ex.Message);

            }

        }




Ora siamo giunti quasi alla conclusione del nostro articolo, dovremmo scrivere il codice per visualizzare a video i record selezionati, in particolare nell’evento click del pulsante, rilevare i record che hanno la spunta nella casella combinata.
Qui di seguito il frammento di codice per entrambi i linguaggi.



VB.Net

Private Sub BtnRileva_Click(sender As Object, e As EventArgs) Handles BtnRileva.Click

        Try

            Dim righeSelezionate = (From row In DtgDati.Rows.OfType(Of DataGridViewRow)() Where row.Cells(0).Value IsNot Nothing AndAlso CBool(row.Cells(0).Value) <> False And row.Cells("Nome").Value IsNot Nothing AndAlso Not String.IsNullOrEmpty(row.Cells("Cognome").Value.ToString()) Select row).ToList()

 

            For Each elementoTrovato In righeSelezionate

                MessageBox.Show("Nome: " & elementoTrovato.Cells("Nome").Value & " Cognome: " + elementoTrovato.Cells("Cognome").Value)

            Next

 

        Catch ex As Exception

            MessageBox.Show("Errore: " & ex.Message)

        End Try

    End Sub

 

C#

  private void BtnRileva_Click(object sender, EventArgs e)

        {

            try

            {

 

 

                var righeSelezionate = (from row in DtgDati.Rows.OfType<DataGridViewRow>()

                                    where row.Cells[0].Value != null && (bool)row.Cells[0].Value != false &

                                          row.Cells["Nome"].Value != null && !string.IsNullOrEmpty(row.Cells["Cognome"].Value.ToString())

                                    select row).ToList();

 

 

                foreach (var elementoTrovato in righeSelezionate)

                {

                    MessageBox.Show("Nome: " + elementoTrovato.Cells["Nome"].Value + " Cognome: " + elementoTrovato.Cells["Cognome"].Value);

                }

 

 

            }

            catch (Exception ex)

            {

                MessageBox.Show("Errore: " + ex.Message);

            }

        }






Conclusioni

In questo articolo si è visto come estendere il controllo DatagridView di progetti per Windows, per la gestione dei dati in maniera più amichevole.
L’inserimento del controllo checkbox nell’intestazione per permettere la selezione e deseleziona dei record diventa per l’utente una miglior gestione dei dati ma soprattutto utilizzando meglio l’applicativo. Il controllo DatagridView offre moltissimo al programma e tanta flessibilità permettendo in maniera semplice di estendere tale controllo.

Nessun commento: