Очевидно, ты не можешь получить свой торт и съесть его.
В настоящее время я использую System.Windows.Forms.WebBrowser
в своем приложении. В настоящее время программа зависит от использования функции GetElementsByTagName
. Я использую его, чтобы собрать все элементы определенного типа (либо «входные», либо «текстовые области»), чтобы я мог отсортировать их и вернуть значение определенного типа. Это код для этой функции (мой веб-браузер называется web1):
// returns the value from a element.
public String FetchValue(String strTagType, String strName)
{
HtmlElementCollection elems;
HtmlDocument page = web1.Document.Window.Frames[1].Document;
elems = page.GetElementsByTagName(strTagType);
foreach (HtmlElement elem in elems)
{
if (elem.GetAttribute("name") == strName ||
elem.GetAttribute("ref") == strName)
{
if (elem.GetAttribute("value") != null)
{
return elem.GetAttribute("value");
}
}
}
return null;
}
(указывает на примечание: веб-страница, с которой мне нужно извлечь, находится во фрейме, и, в зависимости от обстоятельств, идентифицирующее имя элемента будет либо в имени, либо в атрибуте ref)
Все это прекрасно работает с System.Windows.Forms.WebBrowser
.
Но чего он не может сделать, так это перенаправить открытие нового окна, чтобы остаться в приложении. Все, что открывается в новом окне, попадает в браузер пользователя по умолчанию, что приводит к потере сеанса. Эту функциональность можно легко исправить с помощью события NewWindow2
, которого нет в System.Windows.Forms.WebBrowser
.
А теперь простите меня за то, что я был ошеломлен его отсутствием. Я только недавно бросил VB6 и перешел на C# (да, VB6, видимо, я работаю под камнем), и в VB6 WebBrowser
обладал как функцией GetElementsByTagName
, так и событием NewWindow2
.
AxSHDocVw.WebBrowser
имеет событие NewWindow2
. Он был бы более чем счастлив помочь мне направить мои новые окна туда, где они мне нужны. Код для этого в THAT WebBrowser
:
private void web1_NewWindow2(
object sender,
AxSHDocVw.DWebBrowserEvents2_NewWindow2Event e)
{
frmNewWindow frmNW = new frmNewWindow();
e.ppDisp = frmNW.web2.Application;
frmNW.web2.RegisterAsBrowser = true;
frmNW.Visible = true;
}
Я не могу самостоятельно создать способ воспроизвести эту функцию с помощью обычного события NewWindow, которое не приводит в восторг.
Я также не могу понять, как воспроизвести функцию FetchValue
, описанную выше, с помощью файла AxSHDocVw.WebBrowser
. Кажется, что все происходит совершенно по-другому, и все мои знания о том, как это делать, бесполезны.
Я знаю, что я больной, испорченный человек для этой причудливой фантазии об использовании этих двух вещей в одном приложении. Но сможете ли вы найти в своем сердце желание помочь этому глупому идеалисту?