我正在捕获 DataGridView 控件的 SelectionChanged 事件,我的事件处理程序大约需要 1/2 秒来完成其任务(设置多个控件的值等)。用 UI 术语来说,这是永恒的。
问题是 DataGridView 的用户界面不会立即更新选择。我想要的是让用户在单击后立即看到 DataGridView 中的选择更改,然后完成冗长的工作。完成整个任务仍然需要 1/2 秒,并且在此期间 UI 不会响应,这没关系 - 至少用户会得到即时反馈。
您可以通过将以下代码插入新的 Form1 类来查看此行为:
private System.Windows.Forms.DataGridView dataGridView1;
public Form1()
{
InitializeComponent();
dataGridView1 = new DataGridView();
dataGridView1.Dock = DockStyle.Fill;
dataGridView1.Columns.Add("Column0", "Column 0");
dataGridView1.Rows.Add("Row 0");
dataGridView1.Rows.Add("Row 1");
dataGridView1.Rows.Add("Row 2");
dataGridView1.Rows.Add("Row 3");
dataGridView1.SelectionChanged +=
new EventHandler(dataGridView1_SelectionChanged);
this.Controls.Add(dataGridView1);
}
private void dataGridView1_SelectionChanged(object sender, EventArgs e)
{
if (this.Handle != null)
{
this.DoSomethingForAWhile();
// Even BeginInvoke doesn't help
//this.BeginInvoke((MethodInvoker)this.DoSomethingForAWhile);
}
}
private void DoSomethingForAWhile()
{
// Do anything that causes a noticable delay
DateTime t0 = DateTime.Now;
while ((DateTime.Now - t0).TotalSeconds < 2)
{
// Do nothing
}
}
我通常会使用 Control.BeginInvoke 以便在我的 1/2 秒任务开始之前处理绘制消息。这适用于 ListView 控件,但由于某种原因它不适用于 DataGridView。
我可以在另一个线程上进行处理并使用 Invoke 来设置 UI 值,但这对于应该是一项简单任务的事情来说似乎很复杂。
肯定有更好的办法。