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

Articolo che fornisce una tecnica di come estendere il controllo DatagridView con un checkbox nell'intestazione per selezionare e deselezionare i record.

il
Sviluppatore Microsoft .Net, Collaboratore di IProgrammatori

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.