首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何检测DataGridView CheckBox事件更改?

如何检测DataGridView CheckBox事件更改?
EN

Stack Overflow用户
提问于 2012-08-07 09:59:36
回答 20查看 169.6K关注 0票数 115

我有一个winforms应用程序,希望在选中/未选中DataGridView控件中的复选框时触发一些代码。我试过的每一件事

  1. 在单击CheckBox时,但在其检查状态更改之前立即触发,或
  2. 只在CheckBox松开焦点时触发

我似乎找不到在检查状态更改后立即触发的事件。

编辑:

我试图实现的是,当一个CheckBox的检查状态在一个DataGridView中发生变化时,另外两个DataGridView中的数据就会发生变化。然而,我使用过的所有事件,其他网格中的数据只有在第一个CheckBox中的DataGridView失去焦点之后才会改变。

EN

回答 20

Stack Overflow用户

回答已采纳

发布于 2012-08-07 10:42:28

要处理DatGridViewCheckedChanged事件,您必须首先让CellContentClick触发(它不具有CheckBoxes当前状态!)然后打电话给CommitEdit。这将触发CellValueChanged事件,您可以使用该事件来完成您的工作。这是微软的疏忽。做一些如下的事情..。

代码语言:javascript
复制
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();
}

我希望这能帮到你。

P.S.查看本文https://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.currentcelldirtystatechanged(v=vs.110).aspx

票数 127
EN

Stack Overflow用户

发布于 2013-02-21 20:44:20

我找到了@Killercam的解决方案,但如果用户双击的速度太快,我会觉得有点不可靠。不知道其他人是否也发现了这个案子。我找到了另一个解决方案,这里

它使用了数据集的CellValueChangedCellMouseUp。长虹解释说

“这是因为OnCellvalueChanged事件在DataGridView认为您已经完成编辑之前不会触发。这为TextBox列提供了意义,因为OnCellvalueChanged不会费心为每一次键击开火,但对于CheckBox来说却没有意义。”

从他的例子中可以看出:

代码语言:javascript
复制
private void myDataGrid_OnCellValueChanged(object sender, DataGridViewCellEventArgs e)
{
    if (e.ColumnIndex == myCheckBoxColumn.Index && e.RowIndex != -1)
    {
        // Handle checkbox state change here
    }
}

告诉复选框的代码是在单击复选框时进行编辑的,而不是等到用户离开字段时才进行编辑:

代码语言:javascript
复制
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事件中:

代码语言:javascript
复制
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();
    }
}
票数 97
EN

Stack Overflow用户

发布于 2014-10-06 22:18:00

jsturtevants的解决方案效果很好。但是,我选择在EndEdit事件中进行处理。我更喜欢这种方法(在我的应用程序中),因为与CellValueChanged事件不同,EndEdit事件在填充网格时不会触发。

这是我的代码(其中一部分是从jsturtevant偷来的):

代码语言:javascript
复制
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();
    }
}
票数 9
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11843488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档