如何强制在Datagridview的列中仅选中一个复选框?
答案 0 :(得分:4)
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;
}
}
答案 1 :(得分:3)
您必须订阅网格的CellValueChanged
事件,并根据当前单元格的检查状态,循环DataGridView并将true / false设置为其他单元格的值。
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
}
}
}
答案 2 :(得分:2)
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);
}
}
答案 3 :(得分:0)
您可以使用CellEndEdit
DGV
事件,因为它发生在修改单元格之后。请阅读以下代码段中的注释,以使用以下代码:
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;
}
}
}
}
希望这有帮助!
答案 4 :(得分:0)
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;
}
}
}
}
答案 5 :(得分:0)
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;
}
}
}
}
答案 6 :(得分:0)
在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
答案 7 :(得分:0)
您可以在 DGV 上将 VirtualMode 设置为 TRUE ,只允许一个复选框。并且您可以在 DatagridView 上将 VirtualMode 设置为 FALSE 以检查多个。
我认为这是解决方案最简单的方法。
答案 8 :(得分:0)
不用担心列和永远不会失败,试试这个:
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;
}
}
}
}
答案 9 :(得分:-2)
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)
{ }
}
}