Как использовать событие DocumentCompleted управления WebBrowser в C#?

Вы можете использовать 2 способа: int? или Nullable, оба имеют одинаковое поведение. Вы можете сделать микс без проблем, но лучше сделать код максимально чистым.

Вариант 1 (с?):

private void Example(int? arg1, int? arg2)
    {
        if (arg1.HasValue)
        {
            //do something
        }
        if (arg1.HasValue)
        {
            //do something else
        }
    }

Вариант 2 (с нулевым значением):

private void Example(Nullable arg1, Nullable arg2)
    {
        if (arg1.HasValue)
        {
            //do something
        }
        if (arg1.HasValue)
        {
            //do something else
        }
    }

В C # 4.0 появился новый способ сделать то же самое с большей гибкостью в этом случае платформа предлагает необязательные параметры со значениями по умолчанию , таким образом, вы можете установить значение по умолчанию, если метод вызывается без всех параметров.

Вариант 3 (со значениями по умолчанию)

private void Example(int arg1 = 0, int arg2 = 1)
    {
        //do something else
    }

14
задан Margus 19 March 2012 в 20:01
поделиться

3 ответа

Вы также можете узнать о вызовах AJAX.

Рассмотрите возможность использования этого:

private void webBrowser_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    string url = e.Url.ToString();
    if (!(url.StartsWith("http://") || url.StartsWith("https://")))
    {
            // in AJAX
    }

    if (e.Url.AbsolutePath != this.webBrowser.Url.AbsolutePath)
    {
            // IFRAME 
    }
    else
    {
            // REAL DOCUMENT COMPLETE
    }
}
14
ответ дан 1 December 2019 в 13:34
поделиться

Мне пришлось сделать нечто подобное. Что я делаю, так это напрямую использую ShDocVw (добавляя ссылку на все необходимые сборки взаимодействия в мой проект). Затем я добавляю не элемент управления WebBrowser в свою форму, а элемент управления AXShDocVw.AxWebBrowser .

Для перехода и ожидания я использую следующий метод:

private void GotoUrlAndWait(AxWebBrowser wb, string url)
{
    object dummy = null;
    wb.Navigate(url, ref dummy, ref dummy, ref dummy, ref dummy);

    // Wait for the control the be initialized and ready.
    while (wb.ReadyState != SHDocVw.tagREADYSTATE.READYSTATE_COMPLETE)
        Application.DoEvents();
}
0
ответ дан 1 December 2019 в 13:34
поделиться

Мне еще предстоит найти рабочее решение этой проблемы в Интернете. Надеюсь, это выйдет на вершину и сэкономит всем месяцы настройки, которые я потратил, пытаясь решить эту проблему, и связанные с этим крайние случаи. Я боролся с этой проблемой на протяжении многих лет, поскольку Microsoft изменила реализацию / надежность isBusy и document.readystate. В IE8 мне пришлось прибегнуть к следующему решению. Это похоже на вопрос / ответ Маргуса, за некоторыми исключениями. Мой код будет обрабатывать вложенные фреймы, запросы javascript / ajax и мета-перенаправления. Я упростил код для ясности, но я также использую функцию тайм-аута (не входит в комплект) для сброса веб-страницы через 5 минут, если domAccess все еще равен false.

private void m_WebBrowser_BeforeNavigate(object pDisp, ref object URL, ref object Flags, ref object TargetFrameName, ref object PostData, ref object Headers, ref bool Cancel)
{
    //Javascript Events Trigger a Before Navigate Twice, but the first event 
    //will contain javascript: in the URL so we can ignore it.
    if (!URL.ToString().ToUpper().StartsWith("JAVASCRIPT:"))
    {
        //indicate the dom is not available
        this.domAccess = false;
        this.activeRequests.Add(URL);
    }
}

private void m_WebBrowser_DocumentComplete(object pDisp, ref object URL) 
{

    this.activeRequests.RemoveAt(0);

    //if pDisp Matches the main activex instance then we are done.
    if (pDisp.Equals((SHDocVw.WebBrowser)m_WebBrowser.ActiveXInstance)) 
    {
        //Top Window has finished rendering 
        //Since it will always render last, clear the active requests.
        //This solves Meta Redirects causing out of sync request counts
        this.activeRequests.Clear();
    }
    else if (m_WebBrowser.Document != null)
    {
        //Some iframe completed dom render
    }

    //Record the final complete URL for reference
    if (this.activeRequests.Count == 0)
    {
        //Finished downloading page - dom access ready
        this.domAccess = true;
    }
}
3
ответ дан 1 December 2019 в 13:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: