如何处理datagridview中的combobox事件?
How to handle event of combobox in datagridview?
我有一个复选框[All
]和一个数据网格视图,如下所示:
我愿意:
- datagridview里面,如果checkbox全部被勾选,checkbox[
All
]就被勾选,如果checkbox没有被勾选,checkbox[All
]就被勾选
- datagridview里面,有个checkbox没有勾选,checkbox[
All
]没有勾选
我试过了,但我做不到:
private void dataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
bool isAllCheck = false;
if (e.ColumnIndex == 0)
{
foreach (DataGridViewRow row in dataGridView.Rows)
{
DataGridViewCheckBoxCell chk = row.Cells[0] as DataGridViewCheckBoxCell;
isAllCheck = Convert.ToBoolean(chk.Value);
if (!isAllCheck)
{
break;
}
}
if (chkAllItem.Checked && !isAllCheck)
{
chkAllItem.Checked = false;
}
if (!chkAllItem.Checked && isAllCheck)
{
chkAllItem.Checked = true;
}
}
}
private void dataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (this.dataGridView.IsCurrentCellDirty)
{
this.dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
关于这些的任何提示都会有很大帮助。提前致谢。
DataGridViewCheckBoxCell
具有属性 TrueValue
、FalseValue
和 IndeterminateValue
,其默认值为 null
。这些是由 属性 Value
根据复选框的状态给出的值。由于 Convert.ToBoolean
将 null
转换为 false
,如果属性未初始化,转换结果始终为 false
。
这些可以在单元格本身或其拥有的列上初始化。
因此,您需要将拥有列 TrueValue
初始化为 true
并将 FalseValue
初始化为 false
。
设置 TrueValue
、FalseValue
和 IndeterminateValue
是一个好的开始。
我发现我还需要做更多的工作才能使它起作用;除了你的 CurrentCellDirtyStateChanged
事件,我还编码了这些:
这设置所有 CheckBoxCells
:
private void cbx_all_CheckedChanged(object sender, EventArgs e)
{
if (cbx_all.Tag == null) for (int i = 0; i < dataGridView.RowCount; i++)
{
dataGridView.Tag = "busy";
dataGridView[yourCheckBoxcolumnIndex, i].Value = cbx_all.Checked;
dataGridView.Tag = null;
}
}
我编码了 CellValueChanged
而不是 CellContentClick
事件:
private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == yourCheckBoxcolumnIndex && dataGridView.Tag == null)
{
cbx_all.Tag = "busy";
cbx_all.Checked = testChecks(e.ColumnIndex);
cbx_all.Tag = null;
}
}
我用了DGV
的Tag
属性和CheckBox
作为flag,我很忙通过代码更改值。其他一些避免死循环的方法也一样好。
这是测试函数:
bool testChecks(int index)
{
for (int r = 0; r < dataGridView.RowCount; r++)
if ( !(bool)dataGridView[index, r].Value ) return false;
return true;
}
我有一个复选框[All
]和一个数据网格视图,如下所示:
我愿意:
- datagridview里面,如果checkbox全部被勾选,checkbox[
All
]就被勾选,如果checkbox没有被勾选,checkbox[All
]就被勾选 - datagridview里面,有个checkbox没有勾选,checkbox[
All
]没有勾选
我试过了,但我做不到:
private void dataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
bool isAllCheck = false;
if (e.ColumnIndex == 0)
{
foreach (DataGridViewRow row in dataGridView.Rows)
{
DataGridViewCheckBoxCell chk = row.Cells[0] as DataGridViewCheckBoxCell;
isAllCheck = Convert.ToBoolean(chk.Value);
if (!isAllCheck)
{
break;
}
}
if (chkAllItem.Checked && !isAllCheck)
{
chkAllItem.Checked = false;
}
if (!chkAllItem.Checked && isAllCheck)
{
chkAllItem.Checked = true;
}
}
}
private void dataGridView_CurrentCellDirtyStateChanged(object sender, EventArgs e)
{
if (this.dataGridView.IsCurrentCellDirty)
{
this.dataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
}
关于这些的任何提示都会有很大帮助。提前致谢。
DataGridViewCheckBoxCell
具有属性 TrueValue
、FalseValue
和 IndeterminateValue
,其默认值为 null
。这些是由 属性 Value
根据复选框的状态给出的值。由于 Convert.ToBoolean
将 null
转换为 false
,如果属性未初始化,转换结果始终为 false
。
这些可以在单元格本身或其拥有的列上初始化。
因此,您需要将拥有列 TrueValue
初始化为 true
并将 FalseValue
初始化为 false
。
设置 TrueValue
、FalseValue
和 IndeterminateValue
是一个好的开始。
我发现我还需要做更多的工作才能使它起作用;除了你的 CurrentCellDirtyStateChanged
事件,我还编码了这些:
这设置所有 CheckBoxCells
:
private void cbx_all_CheckedChanged(object sender, EventArgs e)
{
if (cbx_all.Tag == null) for (int i = 0; i < dataGridView.RowCount; i++)
{
dataGridView.Tag = "busy";
dataGridView[yourCheckBoxcolumnIndex, i].Value = cbx_all.Checked;
dataGridView.Tag = null;
}
}
我编码了 CellValueChanged
而不是 CellContentClick
事件:
private void dataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == yourCheckBoxcolumnIndex && dataGridView.Tag == null)
{
cbx_all.Tag = "busy";
cbx_all.Checked = testChecks(e.ColumnIndex);
cbx_all.Tag = null;
}
}
我用了DGV
的Tag
属性和CheckBox
作为flag,我很忙通过代码更改值。其他一些避免死循环的方法也一样好。
这是测试函数:
bool testChecks(int index)
{
for (int r = 0; r < dataGridView.RowCount; r++)
if ( !(bool)dataGridView[index, r].Value ) return false;
return true;
}