2012-03-21 68 views
0

的異端你顯然不能有你的蛋糕和吃它。我必須是想要一個C#瀏覽器與NewWindow2和GetElementsByTagName

我目前在我的應用程序中使用了System.Windows.Forms.WebBrowser。該程序目前依賴於使用GetElementsByTagName函數。我用它來收集特定類型的所有元素(「輸入」或「textarea」),所以我可以對它們進行排序並返回特定值的值。這是這個函數的代碼(我的web瀏覽器中名爲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; 
} 

(積分:我需要從處於框架拉網頁,並根據情況,元素的標識名稱將是無論是在名稱還是參考屬性中)

所有這些都像System.Windows.Forms.WebBrowser的夢一樣工作。

但是它無法做到的是重定向一個新窗口的開放以保留在應用程序中。任何在新窗口中打開的內容都將射向用戶的默認瀏覽器,從而失去會話。 NewWindow2事件可以輕鬆修復此功能,而System.Windows.Forms.WebBrowser不具備此功能。

現在原諒我在它不在的時候被驚呆了。我有但是最近放棄了VB6並轉移到C#(是VB6,顯然我受僱於搖滾),並且在VB6中,WebBrowser擁有GetElementsByTagName函數和NewWindow2事件。

AxSHDocVw.WebBrowser有一個NewWindow2事件。我很樂意幫助我將新窗口發送到我需要的地方。在WebBrowser做到這一點的代碼是(frmNewWindow是隻含有另一WebBrowser所謂的WEB2.0(碼頭設置爲填寫一個簡單的表格)):

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詳細說明。它似乎以一種完全不同的方式處理事情,而我對如何做事的知識卻毫無用處。

我知道我是一個生病,扭曲的男人,因爲這個奇怪的幻想在一個應用程序中使用這兩件事情。但是你能否在你的心中找到幫助這個愚蠢的理想主義者的人呢?

+0

你能向我們展示如何重定向到新頁面的代碼嗎?您是否嘗試在當前的WebBrowser控件中重新加載頁面? – 2012-03-21 17:44:34

+0

我目前沒有重定向的代碼。在OP中,第二個代碼塊是如果我有NewWindow2它將如何工作的。我希望將打開的URL重定向到一個新的表單。 – friggle 2012-03-21 18:41:54

回答

2

我不能再依賴這個解決方法,而必須放棄System.Windows.Forms.WebBrowser。我需要NewWindow2。

我終於想出瞭如何用AxWebBrowser完成我所需要的。我原來的帖子要求爲System.Windows.Forms.WebBrowser上的NewWindow2提供解決方案,或者爲.GetElementsByTagName提供AxWebBrowser替換。更換需要大約4倍的代碼,但完成工作。我認爲發佈我的解決方案會比較謹慎,對於後來的Google員工也有同樣的困惑。 (情況下也有更好的方法來完成此操作)

IHTMLDocument2 webpage = (IHTMLDocument2)webbrowser.Document; 
IHTMLFramesCollection2 allframes = webpage.frames; 
IHTMLWindow2 targetframe = (IHTMLWindow2)allframes.item("name of target frame"); 
webpage = (IHTMLDocument2)targetframe.document; 
IHTMLElementCollection elements = webpage.all.tags("target tagtype"); 

foreach (IHTMLElement element in elements) 
{ 
    if (elem.getAttribute("name") == strTargetElementName) 
    { 
    return element.getAttribute("value"); 
    } 
} 

的webbrowser.Document鑄造成的IHTMLDocument2,那麼的IHTMLDocument2的幀放入IHTMLFramesCollection2,然後我投的具體所需的幀到IHTMLWindow2 (您可以通過索引號或名稱選擇框架),然後將框架的.Document成員轉換爲IHTMLDocument2(最初使用的成員,爲了方便起見)。從那裏,IHTMLDocument2的.all.tags()方法在功能上與舊的WebBrowser.Document.GetElementsByTagName()方法相同,除了它需要IHTMLElementCollection和HTMLElementCollection。然後,您可以對集合進行foreach,各個元素需要是IHTMLElement,並使用.getAttribute檢索屬性。請注意,g是小寫字母。

0

WebBrowser控件可以處理NewWindow事件,以便在WebBrowser中打開新的彈出窗口。

private void webBrowser1_NewWindow(object sender, CancelEventArgs e) 
{ 
    // navigate current window to the url 
    webBrowser1.Navigate(webBrowser1.StatusText); 
    // cancel the new window opening 
    e.Cancel = true; 
} 

http://social.msdn.microsoft.com/Forums/en-US/csharpgeneral/thread/361b6655-3145-4371-b92c-051c223518f2/

+0

嘆氣,我當時就夠了。不幸的是,我沒有處理簡單的HTML鏈接。我試過類似的解決方案,但因爲鏈接實際上是一些JavaScript,e.Cancel = true;產生Internet Explorer腳本錯誤,「您是否想繼續在此頁面上運行腳本?」是/無品種。 – friggle 2012-03-21 18:49:30

+0

哦,太棒了,我搜索了一下,幾乎找到了一個解決方案。由於我自己生成錯誤,所以在此事件持續期間暫時抑制Javascript錯誤,我感到很舒服。顯然,在AxSHDocVw.WebBrowser中,有一個叫做Silent的屬性,我可以簡單地將其設置爲true ......但是對於COURSE,System.Windows.Forms.WebBrowser沒有這樣的屬性,這是我的缺點,是我 – friggle 2012-03-21 18:57:04

+0

啊是的,這是由於腳本試圖重定向並且代碼取消它。您也可以防止出現腳本錯誤。 http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser.scripterrorssuppressed.aspx不知道它是否會阻止這些。 – 2012-03-21 18:58:23

0

唯一的解決這個我看到是一個好幾年以前的事了,叫csExWb2,現在在谷歌代碼here

它爲您提供了一個ExWebBrowser控件,但可以全面訪問由IE提供的所有接口和事件。我用它來在WinForms託管的HTML編輯器中對元素進行深度和骯髒的控制。

這可能是一點點跳躍,直接進入那個,心靈。

相關問題