Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在winform中使用webbrowser控件时,如何在各种事件之间引入延迟?_C#_Winforms - Fatal编程技术网

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

C# 在winform中使用webbrowser控件时,如何在各种事件之间引入延迟?,c#,winforms,C#,Winforms,我正在开发一个c#winform应用程序,它使用web浏览器控制一个网站。我需要在单击单个按钮时执行许多事件,但许多事件直到我使用消息框在事件之间提供某种延迟时才会发生。下面是代码 private void button5_Click(object sender, EventArgs e) { try { HtmlDocument webDoc = this.webBrowser1.Document; HtmlElementCollection a

我正在开发一个c#winform应用程序,它使用web浏览器控制一个网站。我需要在单击单个按钮时执行许多事件,但许多事件直到我使用消息框在事件之间提供某种延迟时才会发生。下面是代码

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");
    }
}
在这里,我使用了两个消息框来表示事件之间的延迟。我想要摆脱这些消息框,并想要一些其他方法,可以执行所有事件,并且我不必用一些消息框或可见的东西打断用户,可以通过以下方法完成:

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");
    }
}
Thread.Sleep(time_to_sleep);
但在这种情况下,最好使用事件:

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");
    }
}
当您使用element.InvokeMember(“单击”)时,您告诉webBrowser1执行一些操作:发布/访问某个页面。于是webbrowser开始了这项工作:它调用远程服务器,获取页面,呈现页面。这需要时间,时间可以长也可以短。此调用是异步的,这意味着您的代码可以向前运行,而无需等待webbrowser完成。那你能做什么呢?您可以订阅webbrowser对象事件,该事件将在浏览器控件完成工作时发生

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");
    }
}
//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
    }

听起来你在这里做错了什么,你不应该创造“滞后”,但应该检查某种信号量或事件,你可以注意到,然后在正确的状态下做正确的事情,试图依赖滞后是个坏主意。你能告诉我你为什么要引入滞后吗?@jimplode我对.net不熟悉,这是我的第一个应用程序,不知道任何细节,所以帮我指点一些解决方案@Tony,点击winform中的一个按钮就是点击网页上导航到另一页的链接,在此事件之后,我想在第二页上做一些更改,然后单击第二页上的按钮。所有这些事件只有在我放置消息框时才会发生,如果我移除消息框,则只会发生第一步,即网页被导航到第二页,并且我无法在第二页上执行任何其他事件查看@SLaks回答:嘿,你能提供有关此的更多详细信息吗,关于如何在我的代码中使用它嘿,我不知道如何准确地使用你提供的代码