c# - 听一个复选框

标签 c# winforms datagridview

我找到了几篇对此有“答案”的帖子,但没有一篇对我有用。为什么本应如此简单的事情却如此困难?

我只想做一些事情来响应某人选中/取消选中一列复选框。一种解决方案在大多数情况下都有效,但有时不会触发事件。我在几个地方看到的建议是这样的:

 private void dgv1_CurrentCellDirtyStateChanged(object sender, EventArgs e) {
        if (dgv1.IsCurrentCellDirty) {
            dgv1.CommitEdit(DataGridViewDataErrorContexts.Commit);
        }
}
private void dgv1_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
    // Do whatever I want to do.
}

不幸的是,CellValueChanged 根本没有被调用。 我已经检查并仔细检查是否添加了两个监听器:

dgv1.CellValueChanged += new DataGridViewCellEventHandler(dgv1_CellValueChanged);
dgv1.CurrentCellDirtyStateChanged += new EventHandler(dgv1_CurrentCellDirtyStateChanged);

我向两种方法都添加了打印语句,以验证 CellValueChanged 方法从未被调用,尽管 CurrentCellDirtyStateChanged 方法被调用了。我做错了什么?

编辑: 我将 DataTable 与此 DataGridView 一起使用。我听那个会更好吗?在我离开单元格之前,DataTable 中是否发生了变化?

最佳答案

试一试。但是这次在CellContentClick事件。

private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    switch (e.ColumnIndex)
    {
        case 0: //Where the DataGridViewCheckBoxColumn Index
            dataGridView1[e.ColumnIndex, e.RowIndex].Value = 
                !(bool) dataGridView1[e.ColumnIndex, e.RowIndex].Value;
            if ((bool)dataGridView1[e.ColumnIndex, e.RowIndex].Value)
            {
                //Something to do
            }
            break;
    }
}

选项:您可以将 DataGridViewCheckBoxColumn 属性设置为 readonly = true

关于c# - 听一个复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21630957/

相关文章:

c# - Console.ReadLine() 替代方案

c# - 从 Intersect 返回哪一项,是来自第一个可枚举项还是第二个可枚举项?

c# - 对 REST API 的未授权访问

c# - Show()、ShowDialog() 和 Application.Run() 函数之间有什么区别?

c# - 如何在两种不同形式(同一程序)之间引发事件

mysql - 独立应用程序 Winforms 使用哪个数据库

C# 运行时错误 : "DataGridViewComboBoxCell value is not valid"

c# - 从 DataGridView 中删除行时出现意外行为

c# - 如何在按下 tab 键时跳过 datagridview 中的列

c# - 将 JavaScript 值分配给 C# 变量