我正在开发一个使用网络浏览器控制网站的c#winform应用程序。我需要在单击一个按钮时执行许多事件,但是在我使用消息框在事件之间给出某种延迟之前,许多事件都不会发生。以下是代码
private void button5_Click(object sender, EventArgs e)
{
try
{
HtmlDocument webDoc = this.webBrowser1.Document;
HtmlElementCollection aTags = webDoc.GetElementsByTagName("a");
string selectedIssue;
selectedIssue = AcknowledgeList.SelectedItem.ToString();
foreach (HtmlElement aElement in aTags)
{
if (aElement.InnerText.Contains(selectedIssue))
{
aElement.InvokeMember("click");
break;
}
}
MessageBox.Show("Device Acknowledged");
this.finalAcknowledge();
}
catch (NullReferenceException connectionError)
{
MessageBox.Show("Connection Error , try again");
}
}
private void finalAcknowledge()
{
try
{
HtmlDocument webDoc = this.webBrowser1.Document;
HtmlElement changeNote = webDoc.GetElementById("@note");
string comment = textBox1.Text;
changeNote.SetAttribute("value", comment);
HtmlElementCollection selectTags
= webDoc.GetElementsByTagName("select");
foreach (HtmlElement selectElement in selectTags)
{
if (selectElement.GetAttribute("name").Equals("status"))
{
selectElement.SetAttribute("value", "6");
}
}
HtmlElement submitButton = webDoc.GetElementById("submit_button");
submitButton.InvokeMember("click");
this.button3.PerformClick();
string selectedIssue;
selectedIssue = AcknowledgeList.SelectedItem.ToString();
AcknowledgeList.Items.Remove(AcknowledgeList.SelectedItem);
AssignToList.Items.Add(selectedIssue);
MessageBox.Show("Device Acknowledged");
this.callShowAssigned();
}
catch (NullReferenceException connectionError)
{
MessageBox.Show("Connection Error , try again");
}
}
这里我使用了两个消息框来给出事件之间的一些延迟。我想摆脱这些消息框,并想要一些其他方法可以执行所有事件,我不必用一些消息框或可见的东西打断用户
答案 0 :(得分:2)
延迟可以通过以下方式完成:
Thread.Sleep(time_to_sleep);
但在这种情况下更好地使用事件: http://msdn.microsoft.com/en-us/library/5d67hf8a.aspx
webBrowser1.DocumentCompleted+=OnPageLoaded;
当你aElement.InvokeMember(“点击”)时,你告诉webBrowser1做一些动作:post / get to some page。所以webbrowser开始工作:它调用远程服务器,获取页面,呈现它。这需要时间,可以更长或更短。此调用是异步的,这意味着您的代码无需等待webbrowser完成即可向前运行。所以,你可以做什么?您可以订阅webbrowser对象事件,这将在浏览器控件完成工作时触发。
//Somewhere before InvokeMember
webBrowser1.DocumentCompleted+=OnPageLoaded;
private void OnPageLoaded(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
//Make your final acknowledgement
//This method will be executed every time, when your page is loaded
}