Datagridview forçant qu’une seule case à cocher soit sélectionnée dans une colonne

Comment forcer une seule case à cocher à cocher dans une colonne d’un Datagridview

Vous devrez vous abonner à l’événement CellValueChanged de la grid et, en fonction de l’état de vérification de la cellule actuelle, boucler le DataGridView et définir true / false comme valeur pour les autres cellules.

 void grd_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if ((sender as DataGridView).CurrentCell is DataGridViewCheckBoxCell) { if (Convert.ToBoolean(((sender as DataGridView).CurrentCell as DataGridViewCheckBoxCell).Value)) { // Maybe have a method which does the //loop and set value except for the current cell } } } 
  private void grdRegClass_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (grdRegClass.Columns.IndexOf(grdRegClass.Columns["Status"]) == e.ColumnIndex) { int currentcolumnclicked = e.ColumnIndex; int currentrowclicked = e.RowIndex; foreach (DataGridViewRow dr in grdRegClass.Rows) { dr.Cells[currentcolumnclicked].Value = false; } grdRegClass.CurrentRow.Cells[currentrowclicked].Value = true; } } 
  private void dataGridViewProduit_CellValueChanged(object sender, DataGridViewCellEventArgs e) { if ((sender as DataGridView).CurrentCell is DataGridViewCheckBoxCell) { if (Convert.ToBoolean(((sender as DataGridView).CurrentCell as DataGridViewCheckBoxCell).Value)) { foreach (DataGridViewRow row in (sender as DataGridView).Rows) { if (row.Index != (sender as DataGridView).CurrentCell.RowIndex && Convert.ToBoolean(row.Cells[e.ColumnIndex].Value) == true) { row.Cells[e.ColumnIndex].Value = false; } } } } } private void dataGridViewClient_CurrentCellDirtyStateChanged(object sender, EventArgs e) { if (this.dataGridViewClient.IsCurrentCellDirty) { dataGridViewClient.CommitEdit(DataGridViewDataErrorContexts.Commit); } } 

Vous pouvez utiliser l’événement CellEndEdit de DGV , car il se produit après la modification de la cellule. Veuillez lire les commentaires dans l’extrait de code ci-dessous pour utiliser le code ci-dessous:

 private void dgrvUserProfileView_CellEndEdit(object sender, DataGridViewCellEventArgs e) { int CheckedCount = 0; //Make sure you have set True Value/ false Value property of check box column to 1/0 or true/false resp. //Lets say your column 5th(namely Department) is a checked box column if (dgrvUserProfileView.Columns[e.ColumnIndex].Name == "Department") { for (int i = 0; i <= dgrvUserProfileView.Rows.Count - 1; i++) { if (Convert.ToBoolean(dgrvUserProfileView.Rows[i].Cells["Department"].Value) == true) { CheckedCount = CheckedCount + 1; } } if (CheckedCount == 1) { for (int i = 0; i <= dgrvUserProfileView.Rows.Count - 1; i++) { if (Convert.ToBoolean(dgrvUserProfileView.Rows[i].Cells["Department"].Value) == true) { dgrvUserProfileView.Rows[i].Cells["Department"].ReadOnly = true; } } } else { for (int i = 0; i <= dgrvUserProfileView.Rows.Count - 1; i++) { dgrvUserProfileView.Rows[i].Cells["Department"].ReadOnly = false; } } } } 

J'espère que cela t'aides!

 private void dgvlist_CellContentClick(object sender, DataGridViewCellEventArgs e) { int currentcolumnclicked = e.ColumnIndex; for (int i = 0; i <= dgvlist.Columns.Count - 1; i++) { if (dgvlist.Columns[i] is DataGridViewCheckBoxColumn) { if (Convert.ToString(dgvlist.CurrentRow.Cells[i].EditedFormattedValue) == "True" && i !=currentcolumnclicked) { dgvlist.CurrentRow.Cells[i].Value = false; } } } } 
 private void dgvCaixa_CellContentClick(object sender, DataGridViewCellEventArgs e) { if ((sender as DataGridView).CurrentCell is DataGridViewCheckBoxCell) { foreach (DataGridViewRow row in dgvCaixa.Rows) { if (row.Index != dgvCaixa.CurrentCell.RowIndex && Convert.ToBoolean(row.Cells[e.ColumnIndex].Value) == true) { row.Cells[e.ColumnIndex].Value = false; } } } } 

dans vb.net:

 Private Sub DataGridViewJobsList_CellValueChanged(sender As Object, e As DataGridViewCellEventArgs) Handles DataGridViewJobsList.CellValueChanged If TypeOf TryCast(sender, DataGridView).CurrentCell Is DataGridViewCheckBoxCell Then Dim cell1 As DataGridViewCell cell1 = TryCast(sender, DataGridView).CurrentCell If cell1.Value = True Then For Each row As DataGridViewRow In TryCast(sender, DataGridView).Rows If row.Index <> cell1.RowIndex AndAlso row.Cells(e.ColumnIndex).Value = "1" Then row.Cells(e.ColumnIndex).Value = False End If Next End If End If End Sub Private Sub DataGridViewJobsList_CurrentCellDirtyStateChanged(sender As Object, e As EventArgs) Handles DataGridViewJobsList.CurrentCellDirtyStateChanged If Me.DataGridViewJobsList.IsCurrentCellDirty Then DataGridViewJobsList.CommitEdit(DataGridViewDataErrorContexts.Commit) End If End Sub 

Vous pouvez définir le paramètre VirtualMode sur TRUE sur le DGV pour autoriser une seule case à cocher. et vous pouvez définir le paramètre VirtualMode sur FALSE sur le DatagridView pour en vérifier plusieurs.

Je pense que c’est le moyen le plus simple pour la solution.

 private void dataGridView3_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex == 1) { try { ssortingng val = dataGridView3.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToSsortingng(); if (val == "False") val = "True"; else if (val == "True") val = "False"; dataGridView3.Rows[e.RowIndex].Cells[e.ColumnIndex].Value = val; for (int i = 0; i < dataGridView3.Rows.Count; i++) { string active = ""; if (i != e.RowIndex) { if (val == "False") { dataGridView3.Rows[i].Cells[1].Value = "True"; active = "Y"; } else if (val == "True") { dataGridView3.Rows[i].Cells[1].Value = "False"; active = "N"; } } else { if (val == "False") active = "N"; else active = "Y"; } } } catch (Exception ex) { } } }