Reputation: 7030
How do I force only a single checkbox to be checked in a column of a Datagridview?
Upvotes: 3
Views: 16066
Reputation: 1
Without worrying about the Column and never fail, try this:
private void DgvIVA_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
DataGridView dg = (DataGridView)sender;
if (dg.Rows.Count == 0) return;
if (dg.Rows[e.RowIndex].Cells[e.ColumnIndex].GetType() == typeof(DataGridViewCheckBoxCell))
{
int rowSelIndex = e.RowIndex;
foreach (DataGridViewRow row in dg.Rows)
{
if (row.Index != rowSelIndex)
{
row.Cells[e.ColumnIndex].Value = false;
}
}
}
}
Upvotes: 0
Reputation: 2289
You can set the VirtualMode setting to TRUE on the DGV to allow only one checkbox. and you can set VirtualMode setting to FALSE on the DatagridView to check more than one.
I think this is the easiest way for the solution.
Upvotes: 0
Reputation: 392
in 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
Upvotes: 0
Reputation: 161
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;
}
}
Upvotes: 5
Reputation: 1
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;
}
}
}
}
Upvotes: 0
Reputation: 1
private void dataGridView3_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == 1)
{
try
{
string val = dataGridView3.Rows[e.RowIndex].Cells[e.ColumnIndex].Value.ToString();
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)
{ }
}
}
Upvotes: -2
Reputation: 370
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);
}
}
Upvotes: 2
Reputation: 3
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;
}
}
}
}
Upvotes: 0
Reputation: 1212
You can use CellEndEdit
event of DGV
, as it occurs after when the cell is modified. Kindly read the comments in below code snippet to use the code below:
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;
}
}
}
}
Hope this helps!
Upvotes: 0
Reputation: 38210
You will have to subscribe for the CellValueChanged
event of the grid and depending on the check state of the current cell, loop the DataGridView and set true/false as Value for the other cells.
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
}
}
}
Upvotes: 3