我有一个winforms应用程序,希望在选中/未选中DataGridView控件中的复选框时触发一些代码。我试过的每一件事
CheckBox时,但在其检查状态更改之前立即触发,或CheckBox松开焦点时触发我似乎找不到在检查状态更改后立即触发的事件。
编辑:
我试图实现的是,当一个CheckBox的检查状态在一个DataGridView中发生变化时,另外两个DataGridView中的数据就会发生变化。然而,我使用过的所有事件,其他网格中的数据只有在第一个CheckBox中的DataGridView失去焦点之后才会改变。
发布于 2012-08-07 10:42:28
要处理DatGridView的CheckedChanged事件,您必须首先让CellContentClick触发(它不具有CheckBoxes当前状态!)然后打电话给CommitEdit。这将触发CellValueChanged事件,您可以使用该事件来完成您的工作。这是微软的疏忽。做一些如下的事情..。
private void dataGridViewSites_CellContentClick(object sender,
DataGridViewCellEventArgs e)
{
dataGridViewSites.CommitEdit(DataGridViewDataErrorContexts.Commit);
}
/// <summary>
/// Works with the above.
/// </summary>
private void dataGridViewSites_CellValueChanged(object sender,
DataGridViewCellEventArgs e)
{
UpdateDataGridViewSite();
}我希望这能帮到你。
发布于 2013-02-21 20:44:20
我找到了@Killercam的解决方案,但如果用户双击的速度太快,我会觉得有点不可靠。不知道其他人是否也发现了这个案子。我找到了另一个解决方案,这里。
它使用了数据集的CellValueChanged和CellMouseUp。长虹解释说
“这是因为OnCellvalueChanged事件在DataGridView认为您已经完成编辑之前不会触发。这为TextBox列提供了意义,因为OnCellvalueChanged不会费心为每一次键击开火,但对于CheckBox来说却没有意义。”
从他的例子中可以看出:
private void myDataGrid_OnCellValueChanged(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == myCheckBoxColumn.Index && e.RowIndex != -1)
{
// Handle checkbox state change here
}
}告诉复选框的代码是在单击复选框时进行编辑的,而不是等到用户离开字段时才进行编辑:
private void myDataGrid_OnCellMouseUp(object sender,DataGridViewCellMouseEventArgs e)
{
// End of edition on each click on column of checkbox
if (e.ColumnIndex == myCheckBoxColumn.Index && e.RowIndex != -1)
{
myDataGrid.EndEdit();
}
}编辑: DoubleClick事件与MouseUp事件分开处理。如果检测到DoubleClick事件,应用程序将完全忽略第一个MouseUp事件。除了CellDoubleClick事件之外,还需要将此逻辑添加到MouseUp事件中:
private void myDataGrid_OnCellDoubleClick(object sender,DataGridViewCellEventArgs e)
{
// End of edition on each click on column of checkbox
if (e.ColumnIndex == myCheckBoxColumn.Index && e.RowIndex != -1)
{
myDataGrid.EndEdit();
}
}发布于 2014-10-06 22:18:00
jsturtevants的解决方案效果很好。但是,我选择在EndEdit事件中进行处理。我更喜欢这种方法(在我的应用程序中),因为与CellValueChanged事件不同,EndEdit事件在填充网格时不会触发。
这是我的代码(其中一部分是从jsturtevant偷来的):
private void gridCategories_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
if (e.ColumnIndex == gridCategories.Columns["AddCategory"].Index)
{
//do some stuff
}
}
private void gridCategories_CellMouseUp(object sender, DataGridViewCellMouseEventArgs e)
{
if (e.ColumnIndex == gridCategories.Columns["AddCategory"].Index)
{
gridCategories.EndEdit();
}
}https://stackoverflow.com/questions/11843488
复制相似问题