使用.NET4和c#,我在一个Windows表单上有一个网格。当我点击处理按钮时,我需要对每一行执行几个步骤的及时操作,然后更新该行的结果。这样用户就可以在下一行正在处理时看到进度。如果用户点击取消或关闭表单,则需要完成当前行的处理,然后中断或关闭表单。根据我的研究,这是我得出的结论。我还剩下两个问题。
以下是我的代码:
我还剩下两个问题:
1. 当表格关闭时,我想等待被 OperateGridMethodDelegate 调用的 LongProcess 完成当前的行操作,然后取消操作(就像我使用 ButtonTwo 时一样),但我无法让它起作用。
2. 当调试时,我注意到了一个奇怪的行为,我不确定这是否是错误或正确的,当一行处理完毕时,结果没有设置。相反,下一行会被处理,然后显示前一行的结果。第二行的结果在第三行完成后显示,以此类推。然后最后两行结果基本同时显示。
我的做法正确吗?
以下是我的代码:
delegate void OperateGridMethodDelegate();
delegate void UpdateProgressDelegate(int rowIndex, string msg);
bool isCancelled = false;
private void ButtonOne_Click(object sender, EventArgs e)
{
isCancelled=false;
OperateGridMethodDelegate delegate = new OperateGridMethodDelegate(LongProcess);`
delegate.BeginInvoke(null,null);
}
private void ButtonTow_Click(object sender, EventArgs e)
{
MyButtonOne.Enabled=false;
isCancelled=true;
}
private void LongProcess()
{
foreach (DataRow row in dataTableOne.Rows)
{
//Do Lengthy Process
DisplayResult( rowIndex, "this is result of operation" );
if(isCancelled)
{
MyButtonOne.Enabled=true;
break;
}
}
}
private void DisplayResult(int rowIndex,string message)
{
if(myGrid.InvokeRequired == false)
{
myGrid.Rows[rowIndex].value = message;
}
else
{
UpdateProgressDelegate delegate = new UpdateProgressDelegate(DisplayResult);
myGrid.BeginInvoke(delegate, new object[] { rowIndex, message });
}
}
我还剩下两个问题:
1. 当表格关闭时,我想等待被 OperateGridMethodDelegate 调用的 LongProcess 完成当前的行操作,然后取消操作(就像我使用 ButtonTwo 时一样),但我无法让它起作用。
2. 当调试时,我注意到了一个奇怪的行为,我不确定这是否是错误或正确的,当一行处理完毕时,结果没有设置。相反,下一行会被处理,然后显示前一行的结果。第二行的结果在第三行完成后显示,以此类推。然后最后两行结果基本同时显示。
我的做法正确吗?