Как получить документ CDHtmlDialog после Asp.Net AJAX UpdatePanel

голоса
1

Когда страница отображается в нашем CDHtmlDialog делает Asp.Net AJAX UpdatePanel мы получаем событие навигации, но все после того, что, кажется, потерял. У нас нет документа больше или получить какие-либо события мышей на этой странице.

Задан 10/12/2008 в 00:25
источник пользователем
На других языках...                            


1 ответов

голоса
0

Похоже, я сделал оригинальный пост как незарегистрированный пользователь, поэтому я не думаю, что я могу изменить его. Мы были в состоянии работать вокруг первоначального выпуска, но он пришел снова в другом контексте (на самом деле начинают ненавидеть CDHTMLDialog).

Вот причина проблемы:
вызовы Javascript вызывают событие Navigate и CDHtmlDialog :: OnBeforeNavigate вызывается и разрывает соединение и удаляет IHTMLDocument2. К сожалению , это не верно , так как Navigate страница никогда не изменял. Это означает , что CDHtmlDialog :: OnNavigateComplete никогда не вызывается , чтобы получить документ обратно.

Что еще хуже, когда я переопределять CDHtmlDialog :: OnBeforeNavigate я нахожу строку URL неразборчивое (ошибка)?

Самое простое (? Лучшее) решение:
Мы должны перехватить Перед Navigate события, и вызывать только _OnBeforeNavigate2 в CDHtmlDialog, если URL - адрес не является Javascript действия:

BEGIN_EVENTSINK_MAP(CMyHTMLDlg, CDHtmlDialog)
    ON_EVENT(CMyHTMLDlg, AFX_IDC_BROWSER, DISPID_BEFORENAVIGATE2, OnBeforeNavigate2, VTS_DISPATCH VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_VARIANT VTS_PBOOL)
END_EVENTSINK_MAP()

void CMyHTMLDlg::OnBeforeNavigate2(LPDISPATCH pDisp, VARIANT* URL,VARIANT* Flags, VARIANT* TargetFrameName, VARIANT* PostData,VARIANT* Headers, BOOL* Cancel)
{

    ...

    if (URL != NULL)
    {
        // Check if navigation is to a folder..
        CString url = CString(*URL);

        if(url.Left(11) != _T("javascript:"))
        {
            _OnBeforeNavigate2(pDisp, URL, Flags, TargetFrameName, PostData, Headers, (BOOL*)Cancel);
            // If dynamic linking MFC then the above handler doesn't exist. Need to call OnBeforeNavigate direct. 
            // This is from a code site, and it compiles, but I've never tested it to see if it works.
            //CDHtmlDialog::OnBeforeNavigate(pDisp,(LPCSTR)URL);
        }
    }
}

Большая часть этого является довольно стандартным для создания подкласса CDHtmlDialog, и это довольно просто на самом деле, но он взял меня немного, чтобы выяснить, как обращаться с JavaScript. К сожалению, я не знаю, как это будет работать, если JavaScript делает динамические изменения в самой странице.

Пара отмечает:

  • Если навигация должна быть полностью отменена здесь, а затем установить * Отмена = TRUE и не называйте _OnBeforeNavigate2. Будьте осторожны, потому что это также отменяет любые действия JavaScript.
  • Это было не ясно , пока я не увидел источник , но CDHtmlDialog :: _ OnBeforeNavigate2 просто вызывает CDHtmlDialog :: OnBeforeNavigate.
Ответил 02/02/2009 в 18:34
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more