捕获单元格列单击并执行事件
本文关键字:执行 事件 单击 单元格 | 更新日期: 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.
//
}
}
}
}