[Asp.net]最全的WebBrowser使用協助案例__.net

來源:互聯網
上載者:User

1、主要用途:使使用者可以在表單中導航網頁。

2、注意:WebBrowser 控制項會佔用大量資源。使用完該控制項後一定要調用 Dispose 方法,以便確保及時釋放所有資源。必須在附加事件的同一線程上調用 Dispose 方法,該線程應始終是訊息或使用者介面 (UI) 線程。

3、WebBrowser 使用下面的成員可以將控制項導航到特定 URL、在導航歷程清單中向後和向前移動,還可以載入目前使用者的首頁和搜尋網頁:

1.URL屬性:可讀、可寫,用於擷取或設定當前文檔的 URL。 

WebBrowser 控制項維護瀏覽會話期間訪問的所有網頁的歷程清單。設定Url屬性時,WebBrowser 控制項導航到指定的 URL 並將該 URL 添加到歷程清單的末尾。

WebBrowser 控制項在本地硬碟的緩衝中儲存最近訪問過的網站的網頁。每個頁面都可以指定一個到期日,指示頁面在緩衝中保留的時間。當控制項定位到某頁時,如果該頁具有緩衝的版本,則直接顯示緩衝中的內容而不必重新下載該頁,從而節省了時間。使用 Refresh 方法強制 WebBrowser控制項通過下載來重新載入當前頁,從而確保控制項顯示最新版本。

注意:即使已請求了另一個文檔,該屬性也包含當前文檔的 URL。如果設定該屬性的值,然後立即再次檢索該值,要是 WebBrowser 控制項尚未來得及載入新文檔,則檢索到的值可能與設定的值不同。

2.Navigate方法: 將指定位置的文檔載入到 WebBrowser 控制項中。

3.GoBack方法:如果導航記錄中的上一頁可用,則將 WebBrowser 控制項導航到該頁。

如果導航成功,則返回true;如果導航記錄中的上一頁不可用,則返回false。

 WebBrowser 控制項維護瀏覽會話期間訪問的所有網頁的歷程清單。可以使用GoForward方法實現一個[上一頁] 按鈕。

使用 CanGoBack 屬性確定導航記錄是否可用以及是否包含上一頁。處理 CanGoBackChanged 事件,在 CanGoBack 屬性值更改時接收通知。

4.GoForward方法:如果導航記錄中的下一頁可用,則將 WebBrowser 控制項導航到該頁。

如果導航成功,則返回true;如果導航記錄中的下一頁不可用,則返回false。

WebBrowser 控制項維護瀏覽會話期間訪問的所有網頁的歷程清單。可以使用 GoForward 方法實現一個“前進”按鈕.

使用 CanGoForward 屬性確定導航記錄是否可用以及是否包含當前頁之後的頁。處理 CanGoForwardChanged 事件,在 CanGoForward 屬性值更改時接收通知 

  5.GoHome方法:將 WebBrowser 控制項導航到目前使用者的首頁。

  6.GoSearch方法:將 WebBrowser 控制項導航到目前使用者的預設搜尋網頁。 

    預設搜尋網頁儲存在註冊表的 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\Search Page 登錄機碼下。

    若要使用其他搜尋網頁而不是預設搜尋網頁,請調用 Navigate 方法或指定 Url 屬性。

  7.Refresh方法:重新載入當前顯示在 WebBrowser 控制項中的文檔。

  8.Stop方法:取消所有掛起的導航並停止所有動態網頁元素(如背景聲音和動畫)。

如果導航不成功,則顯示一頁指示出現的問題。使用這些成員中的任何一個進行導航都會導致在導航的不同階段發生 Navigating、Navigated 和DocumentCompleted 事件。


4、ObjectForScripting 屬性:擷取或設定一個對象,該對象可由顯示在 WebBrowser 控制項中的網頁所包含的指令碼代碼訪問。

使用該屬性啟用 WebBrowser 控制項承載的網頁與包含 WebBrowser 控制項的應用程式之間的通訊。使用該屬性可以將動態 HTML (DHTML) 代碼與用戶端應用程式代碼整合在一起。為該屬性指定的對象可作為 window.external 對象(用於主機訪問的內建 DOM 對象)用於網頁指令碼。

可以將此屬性設定為希望其公用屬性和方法可用於指令碼代碼的任何 COM 可見的對象。可以通過使用 ComVisibleAttribute 對類進行標記使其成為 COM 可見的類。

若要從用戶端應用程式代碼調用網頁中定義的函數,請使用可從 Document 屬性檢索的 HtmlDocument 對象的 HtmlDocument.InvokeScript 方法。

5、AllowNavigation屬性:擷取或設定一個值,該值指示控制項在載入其初始頁之後是否可以導航到其他頁。

6、AllowWebBrowserDrop屬性:擷取或設定一個值,該值指示 WebBrowser 控制項是否導航到拖放到它上面的文檔。

7、WebBrowserShortcutsEnabled屬性:是否啟用WebBrowser內建的快速鍵。

8、ScriptErrorsSuppressed 屬性:擷取或設定一個值,該值指示出現指令碼錯誤時,WebBrowser 控制項是否顯示錯誤對話方塊。

9、IsWebBrowserContextMenuEnabled屬性:是否啟用右鍵菜單。


源:MSDN http://msdn.microsoft.com/zh-cn/library/system.windows.forms.webbrowser(v=vs.80).aspx

C#WinForm WebBrowser (二) 實用方法總結 

實用方法1:擷取狀態列資訊

void webBrowser1_StatusTextChanged(object sender, EventArgs e)
{
    label1.Text = webBrowser1.StatusText;
}

實用方法2:頁面跳轉後改變地址欄地址

//在Navigated事件處理函數中改變地址欄地址是最恰當的:
private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
{
    textBox1.Text = webBrowser1.Url.ToString();
}

實用方法3:設定單選框

//建議使用執行單擊事件的方式來設定單選框,而不是修改屬性:
webBrowser1.Document.GetElementById("RBT_A").InvokeMember("click");

實用方法4:設定聯動型下拉式清單

//比較常見的聯動型多級下拉式清單就是省/市縣選擇了,這種情況下直接設定選擇項的屬性不會觸發聯動,需要在最後執行觸發事件函數才能正常工作:

foreach (HtmlElement f in s.GetElementsByTagName("option"))
{
    if (f.InnerText == "北京")
    {
        f.SetAttribute("selected", "selected");
    }
    else
    {
        f.SetAttribute("selected", "");
    }
}
s.RaiseEvent("onchange");

以上四種方法轉於:http://www.cnblogs.com/SkyD/archive/2009/04/23/1441696.html

實用方法一:在WinForm中相應Web事件
假設HTML原始碼如下:

<html> 
<body> 
<input type="button" id="btnClose" value="關閉" /> 
</body> 
</html>

  

HtmlDocument htmlDoc = webBrowser.Document; 
HtmlElement btnElement = htmlDoc.All["btnClose"]; 
if (btnElement != null) 

    btnElement.click += new HtmlElementEventHandler(HtmlBtnClose_Click); 
}


//很簡單吧。那麼稍稍進階一點的——我們都知道一個HTML元素可能有很多各種各樣的事件,而HtmlElement這個類只給出最常用、共通的幾個。那麼,如何響應其他事件呢。這也很簡單,只需要調用HtmlElement的AttachEventHandler就可以了:

btnElement.AttachEventHandler("onclick", new EventHandler(HtmlBtnClose_Click));  
//這一句等價於上面的btnElement.click += new HtmlElementEventHandler(HtmlBtnClose_Click); 

對於其他事件,把"onclick"換成該事件的名字就可以了。例如:

formElement.AttachEventHandler("onsubmit", new EventHandler(HtmlForm_Submit)); 

  

實用方法二:類比表單自動填寫和提交

假設有一個最簡單的登入頁面,輸入使用者名稱密碼,點“登入”按鈕即可登入。已知使用者名稱輸入框的id(或Name,下同)是username,密碼輸入框的id是password,“登入”按鈕的id是submitbutton,那麼我們只需要在webBrowser的DocumentCompleted事件中使用下面的代碼即可:

HtmlElement btnSubmit = webBrowser.Document.All["submitbutton"]; 
HtmlElement tbUserid = webBrowser.Document.All["username"]; 
HtmlElement tbPasswd = webBrowser.Document.All["password"]; 

if (tbUserid == null || tbPasswd == null || btnSubmit == null) 
    return; 

tbUserid.SetAttribute("value", "smalldust"); 
tbPasswd.SetAttribute("value", "12345678"); 

btnSubmit.InvokeMember("click");

關於表單的提交,的確還有另一種方法就是擷取form元素而不是button,並用form元素的submit方法:

HtmlElement formLogin = webBrowser.Document.Forms["loginForm"];  
//……  
formLogin.InvokeMember("submit"); 

本文之所以沒有推薦這種方法,是因為現在的網頁,很多都在submit按鈕上添加onclick事件,以對提交的內容做最基本的驗證。如果直接使用form的submit方法,這些驗證代碼就得不到執行,有可能會引起錯誤。 

實用方法三:呼叫指令碼

首先是調用Web頁面的指令碼中已經定義好的函數。假設HTML中有如下JavaScript:

function DoAdd(a, b) {
    return a + b;
}

那麼,我們要在WinForm調用它,只需如下代碼即可:

object oSum = webBrowser.Document.InvokeScript("DoAdd", new object[] { 1, 2 });
int sum = Convert.ToInt32(oSum);

 

其次,如果我們想執行一段Web頁面中原本沒有的指令碼,該怎麼做呢。這次.Net的類沒有提供,看來還要依靠COM了。IHTMLWindow2可以將任意的字串作為指令碼代碼來執行。

string scriptline01 = @"function ShowPageInfo() {";
string scriptline02 = @"     var numLinks = document.links.length; ";
string scriptline03 = @"     var numForms = document.forms.length; ";
string scriptline04 = @"     var numImages = document.images.length; ";
string scriptline05 = @"     var numScripts = document.scripts.length; ";
string scriptline06 = @"     alert('網頁的統計結果:\r\n連結數:' + numLinks + ";
string scriptline07 = @"        '\r\n表單數:' + numForms + ";
string scriptline08 = @"        '\r\n映像數:' + numImages + ";
string scriptline09 = @"        '\r\n指令碼數:' + numScripts);}";
string scriptline10 = @"ShowPageInfo();";

string strScript = scriptline01 + scriptline02 + scriptline03 + scriptline04 + scriptline05 +
                   scriptline06 + scriptline07 + scriptline08 + scriptline09 + scriptline10;

IHTMLWindow2 win = (IHTMLWindow2)webBrowser.Document.Window.DomWindow;
win.execScript(strScript, "Javascript");
 

以上三種實用方法轉於:http://www.cnblogs.com/smalldust/archive/2006/03/08/345561.html

最後:在指令碼中調用

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.