如何在winform中使用webbrowser控件时引入各种事件之间的延迟?

时间:2011-04-12 12:29:17

标签: c# winforms

我正在开发一个使用网络浏览器控制网站的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");
    }
}

这里我使用了两个消息框来给出事件之间的一些延迟。我想摆脱这些消息框,并想要一些其他方法可以执行所有事件,我不必用一些消息框或可见的东西打断用户

1 个答案:

答案 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
    }