捕获单元格列单击并执行事件

本文关键字:执行 事件 单击 单元格 | 更新日期: 2023-09-27 18:21:39

hi我有一个datagridview,它的第一列(index=0)是复选框列。我想在选中和取消选中单元格时更新标签。我的函数似乎工作得很好,但直到该列中的下一个单元格更改后,它才会更新标签。

当表单加载时,所有行都被检查,比如说4行中的4行。我取消选中一行,标签不会更新。我取消选中另一行,然后它显示3,所以你可以看到它落后了一步。

我尝试过一些不同的DataGridViewCellEvents,如CellValueChanged、CellStateChanged、CellEndEdit,但它们都是按原样操作的。我仍然需要一个DataGridViewCellEventArgs e,这样我就可以检查列了。

有什么建议吗?

private void fileGrid_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0)
            {
                int numberOfFiles = 0;
                for (int i = 0; i < fileGrid.Rows.Count; i++)
                {
                    Console.WriteLine(fileGrid[0, i].Value.ToString());
                    if (fileGrid[0, i].Value.ToString() == "True")
                    {
                        numberOfFiles++;
                    }
                }
                numberOfFilesLabel.Text = numberOfFiles.ToString();
            }
        }

我还不能回答我自己的问题,但这是我过去常做的事情:

private void fileGrid_CellContentClick(object sender, DataGridViewCellEventArgs e)
        {
            if (e.ColumnIndex == 0)
            {
                int numberOfFiles = 0;
                for (int i = 0; i < fileGrid.Rows.Count; i++)
                {
                    Console.WriteLine(fileGrid[0, i].Value.ToString());
                    if (fileGrid[0, i].Value.ToString() == "True")
                    {
                        numberOfFiles++;
                    }
                }
                if (fileGrid.IsCurrentCellDirty)
                    fileGrid.CommitEdit(DataGridViewDataErrorContexts.Commit);
                if (fileGrid.CurrentCell.Value.ToString().Equals("True"))
                {
                    numberOfFiles++;
                }
                if (fileGrid.CurrentCell.Value.ToString().Equals("False"))
                {
                    numberOfFiles--;
                }
                numberOfFilesLabel.Text = numberOfFiles.ToString();
            }
        }

捕获单元格列单击并执行事件

发生这种情况是因为在更改复选框后不会直接提交编辑后的值。它承诺,当你离开编辑。你必须立即投入价值,才能得到你想要的行为。我找到了一种方法,但没有尝试,那就是:

private void dataGridView2_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
        if (e.ColumnIndex == 0)
        {
            if (dataGridView2.IsCurrentCellDirty)
                dataGridView2.CommitEdit(DataGridViewDataErrorContexts.Commit);
            if (dataGridView2.CurrentCell.Value.ToString().Equals("True"))
            {
                MessageBox.Show("Now do the job while checked value changed to True.");
                //
                // Do the job here.
                //
            }
        }
}

编辑:

演示解决方案。

public partial class Form1 : Form
{
    class MyClass
    {
        public bool Check { get; set; }
        public string Name { get; set; }
    }
    public Form1()
    {
        InitializeComponent();
        List<MyClass> lst = new List<MyClass>();
        lst.AddRange(new[] { new MyClass { Check = false, Name = "item 1" }, new MyClass { Check = false, Name = "item 2" } });
        dataGridView1.DataSource = lst;
    }
    private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        if (e.ColumnIndex == 0)
        {
            if (dataGridView1.IsCurrentCellDirty)
                dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit);
            if (dataGridView1.CurrentCell.Value.ToString().Equals("True"))
            {
                MessageBox.Show("Now do the job while checked value changed to True.");
                //
                // Do the job here.
                //
            }
        }
    }
}