C#加载文档后执行某些操作

时间:2012-09-10 06:52:05

标签: c# webbrowser-control

我想在文档完全加载后做一些事情...我不想使用WebBrowser.DocumentCompleted事件,所以请不要建议我这样做。

我尝试了两种方法,但它们不起作用。有人能告诉我我做错了吗?

示例1

wb.Navigate("http://www.google.com");
while(wb.ReadyState != WebBrowserReadyState.Complete) { }
richtextdocument.Text = wb.DocumentText;

示例2

wb.Navigate("http://www.google.com");
while(wb.isBusy == true) { }
richtextdocument.Text = wb.DocumentText;

3 个答案:

答案 0 :(得分:1)

尝试使用计时器来验证文档加载状态。

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if(webBrowser1.ReadyState == WebBrowserReadyState.Complete)
            {
                timer1.Enabled = false;
                richTextBox1.Text = webBrowser1.DocumentText;
            }
        }

        private void button1_Click(object sender, EventArgs e)
        {
            timer1.Enabled = true;
            webBrowser1.Navigate("http://www.google.com");
        }
    }

答案 1 :(得分:0)

你在这里处理的是试图同步调用一个固有的异步方法。

正如您在问题评论中提到的那样,不使用DocumentCompleted的原因是您需要将该事件用于其他目的,我建议您使用DocumentCompleted事件,加上私有类布尔标志,以确定这是否是DocumentCompleted的特殊情况。

private bool wbNeedsSpecialAction; //when you need to call the special case of Navigate() set this flag to true

public Form1() 
{
    InitializeComponent();         
    wb.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(wb_DocumentCompleted);
}

void wb_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (wbNeedsSpecialAction)
    {
        richtextdocument.Text = wb.DocumentText;
        wbNeedsSpecialAction = false;
    }
    else
    {
        //other cases of using DocumentCompleted...
    }
}

public void Browse()
{
    wbNeedsSpecialAction = true; //make sure the event is treated differently
    wb.Navigate("http://www.google.com");
}

这仍然允许您控制事件处理程序中的其他情况。

您必须特别注意确保您的用户在此“特殊操作”页面完成加载之前无法再触发Navigate() ,否则可能窃取特殊情况事件。一种方法是在页面完成加载之前阻止UI,例如:

Cursor.Current = Cursors.WaitCursor;

答案 2 :(得分:0)

while(wb.ReadyState != WebBrowserReadyState.Complete) {application.doevents }