1

ドキュメントが完全にロードされた後に何かをしたい... WebBrowser.DocumentCompleted イベントを使用したくないので、これを提案しないでください。

私はそれを行うために2つの方法を試しましたが、うまくいきません。誰かが私が間違っていることを教えてもらえますか?

例 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;
4

3 に答える 3

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");
        }
    }
于 2012-09-10T07:08:08.313 に答える
0
while(wb.ReadyState != WebBrowserReadyState.Complete) {application.doevents }
于 2012-09-25T14:18:28.210 に答える
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() 前に、ユーザーが別の呼び出しをトリガーできないように、特別な注意を払う必要があります。そうしないと、特別なケースのイベントが盗まれる可能性があります。1 つの方法は、ページの読み込みが完了するまで UI をブロックすることです。次に例を示します。

Cursor.Current = Cursors.WaitCursor;
于 2012-09-10T07:14:00.023 に答える