如何创建一个按钮,逐个单击所有提到的按钮

时间:2015-03-27 17:26:58

标签: .net visual-studio

我的表单中有多个按钮,用于执行某些SQL Server功能。我想制作一个通用按钮,一个接一个地点击所有按钮。他们必须按特定顺序一个接一个地执行。所以一个按钮不能执行,直到前一个按钮没有完成执行。 我如何实现这一目标? 我可以使用'button.PerformClick()',但不会等待之前的按钮操作完成。 请帮助

3 个答案:

答案 0 :(得分:1)

查看TaskTaskCompletionSource。类似(“作弊”方法,除了添加SetResult之外,不需要对现有点击事件处理程序进行任何更改):

tcsResponse1 = new TaskCompletionSource<Button1ResponseObject>();
Button1.PerformClick();
responseStatus = tcsResponse1.Task.Wait();

tcsResponse2 = new TaskCompletionSource<Button2ResponseObject>();
Button2.PerformClick();
responseStatus = tcsResponse2.Task.Wait();

...

在执行按钮操作方法中,您将执行以下操作:

tcsResponse1.SetResult(new Button1ResponseObject {/* init here */};

或者,您可以将执行数据库操作的代码重写为:

private async Task<MyReturnType> Button1Action()
{
    ...
    return new MyReturnType{ /* init as necessary */}
}

然后将其称为:

var button1Result = await Button1Action();
var button2Result = await Button2Action();
// etc.

您还需要将Click事件处理程序修改为await执行实际工作的方法。

您需要查看Variable Scope in Lambda Expressions并确保准确了解正在发生的事情(提示:如果您不这样做并尝试多次运行按钮点击序列,您可能最终完成任务例外)。

从提供的非常有限的细节来看,这听起来像是在执行某种工作流程。可能值得研究Windows Workflow Foundation。

答案 1 :(得分:0)

在奥卡姆剃刀的帮助下

public void ClickAll(object sender, smthIForgot e)
{
   ClickButton1(null, null);
   ClickButton3(null, null);
   ClickButton2(null, null);
}

答案 2 :(得分:0)

如何为每个按钮创建布尔值并在完成订单后将其设置为true?然后,当所有这些都被执行时,您可以将它们全部重置为false。 在循环按钮时,你必须做if(booleanIsTrue) button.PerformClick();之类的事情。

示例:

//in the form
Bool btnsAllCompleted = false; //to check if they have all completed
Bool btn1Completed = false; //for all your buttons

//this inside the universal button
while(!btnsAllCompleted)
{
    button1.PerformClick(); //first one without any check
    if(btn1Completed) button2.PerformClick(); //inside the perform click you'll have to set its boolean to true at the end
    if(btn2Completed) button3.PerformClick();
    //.
    //.
    //.
    if(btnXCompleted /*last button*/) btnsAllCompleted = !btnsAllCompleted
}
setAllBtnsCompletedToFalse(); //a function to set them all to false again