1、主要用途:使用戶可以在窗體中導(dǎo)航網(wǎng)頁。
2、注意:WebBrowser控件會(huì)占用大量資源。使用完該控件后一定要調(diào)用Dispose方法,以便確保及時(shí)釋放所有資源。必須在附加事件的同一線程上調(diào)用Dispose方法,該線程應(yīng)始終是消息或用戶界面(UI)線程。
3、WebBrowser使用下面的成員可以將控件導(dǎo)航到特定URL、在導(dǎo)航歷史記錄列表中向后和向前移動(dòng),還可以加載當(dāng)前用戶的主頁和搜索頁:
1.URL屬性:可讀、可寫,用于獲取或設(shè)置當(dāng)前文檔的URL。
WebBrowser控件維護(hù)瀏覽會(huì)話期間訪問的所有網(wǎng)頁的歷史記錄列表。設(shè)置Url屬性時(shí),WebBrowser控件導(dǎo)航到指定的URL并將該URL添加到歷史記錄列表的末尾。
WebBrowser控件在本地硬盤的緩存中存儲(chǔ)最近訪問過的站點(diǎn)的網(wǎng)頁。每個(gè)頁面都可以指定一個(gè)到期日期,指示頁面在緩存中保留的時(shí)間。當(dāng)控件定位到某頁時(shí),如果該頁具有緩存的版本,則直接顯示緩存中的內(nèi)容而不必重新下載該頁,從而節(jié)省了時(shí)間。使用Refresh方法強(qiáng)制WebBrowser控件通過下載來重新加載當(dāng)前頁,從而確保控件顯示最新版本。
注意:即使已請求了另一個(gè)文檔,該屬性也包含當(dāng)前文檔的URL。如果設(shè)置該屬性的值,然后立即再次檢索該值,要是WebBrowser控件尚未來得及加載新文檔,則檢索到的值可能與設(shè)置的值不同。
2.Navigate方法:將指定位置的文檔加載到WebBrowser控件中。
3.GoBack方法:如果導(dǎo)航歷史記錄中的上一頁可用,則將WebBrowser控件導(dǎo)航到該頁。
如果導(dǎo)航成功,則返回true;如果導(dǎo)航歷史記錄中的上一頁不可用,則返回false。
WebBrowser控件維護(hù)瀏覽會(huì)話期間訪問的所有網(wǎng)頁的歷史記錄列表。可以使用GoForward方法實(shí)現(xiàn)一個(gè)“后退”按鈕。
使用CanGoBack屬性確定導(dǎo)航歷史記錄是否可用以及是否包含上一頁。處理CanGoBackChanged事件,在CanGoBack屬性值更改時(shí)接收通知。
4.GoForward方法:如果導(dǎo)航歷史記錄中的下一頁可用,則將WebBrowser控件導(dǎo)航到該頁。
如果導(dǎo)航成功,則返回true;如果導(dǎo)航歷史記錄中的下一頁不可用,則返回false。
WebBrowser控件維護(hù)瀏覽會(huì)話期間訪問的所有網(wǎng)頁的歷史記錄列表。可以使用GoForward方法實(shí)現(xiàn)一個(gè)“前進(jìn)”按鈕.
使用CanGoForward屬性確定導(dǎo)航歷史記錄是否可用以及是否包含當(dāng)前頁之后的頁。處理CanGoForwardChanged事件,在CanGoForward屬性值更改時(shí)接收通知
5.GoHome方法:將WebBrowser控件導(dǎo)航到當(dāng)前用戶的主頁。
6.GoSearch方法:將WebBrowser控件導(dǎo)航到當(dāng)前用戶的默認(rèn)搜索頁。
默認(rèn)搜索頁存儲(chǔ)在注冊表的HKEY_CURRENT_USER/Software/Microsoft/InternetExplorer/Main/SearchPage注冊表項(xiàng)下。
若要使用其他搜索頁而不是默認(rèn)搜索頁,請調(diào)用Navigate方法或指定Url屬性。
7.Refresh方法:重新加載當(dāng)前顯示在WebBrowser控件中的文檔。
8.Stop方法:取消所有掛起的導(dǎo)航并停止所有動(dòng)態(tài)頁元素(如背景聲音和動(dòng)畫)。
如果導(dǎo)航不成功,則顯示一頁指示出現(xiàn)的問題。使用這些成員中的任何一個(gè)進(jìn)行導(dǎo)航都會(huì)導(dǎo)致在導(dǎo)航的不同階段發(fā)生Navigating、Navigated和DocumentCompleted事件。
4、ObjectForScripting屬性:獲取或設(shè)置一個(gè)對象,該對象可由顯示在WebBrowser控件中的網(wǎng)頁所包含的腳本代碼訪問。
使用該屬性啟用WebBrowser控件承載的網(wǎng)頁與包含WebBrowser控件的應(yīng)用程序之間的通信。使用該屬性可以將動(dòng)態(tài)HTML(DHTML)代碼與客戶端應(yīng)用程序代碼集成在一起。為該屬性指定的對象可作為window.external對象(用于主機(jī)訪問的內(nèi)置DOM對象)用于網(wǎng)頁腳本。
可以將此屬性設(shè)置為希望其公共屬性和方法可用于腳本代碼的任何COM可見的對象。可以通過使用ComVisibleAttribute對類進(jìn)行標(biāo)記使其成為COM可見的類。
若要從客戶端應(yīng)用程序代碼調(diào)用網(wǎng)頁中定義的函數(shù),請使用可從Document屬性檢索的HtmlDocument對象的HtmlDocument.InvokeScript方法。
5、AllowNavigation屬性:獲取或設(shè)置一個(gè)值,該值指示控件在加載其初始頁之后是否可以導(dǎo)航到其他頁。
6、AllowWebBrowserDrop屬性:獲取或設(shè)置一個(gè)值,該值指示W(wǎng)ebBrowser控件是否導(dǎo)航到拖放到它上面的文檔。
7、WebBrowserShortcutsEnabled屬性:是否啟用WebBrowser自帶的快捷鍵。
8、ScriptErrorssupPRessed屬性:獲取或設(shè)置一個(gè)值,該值指示出現(xiàn)腳本錯(cuò)誤時(shí),WebBrowser控件是否顯示錯(cuò)誤對話框。
9、IsWebBrowserContextMenuEnabled屬性:是否啟用右鍵菜單。
源:MSDNhttp://msdn.microsoft.com/zh-cn/library/system.windows.forms.webbrowser(v=vs.80).aspx
C#WinFormWebBrowser(二)實(shí)用方法總結(jié)
實(shí)用方法1:獲取狀態(tài)欄信息
voidwebBrowser1_StatusTextChanged(objectsender,EventArgse) { label1.Text=webBrowser1.StatusText; }
實(shí)用方法2:頁面跳轉(zhuǎn)后改變地址欄地址
//在Navigated事件處理函數(shù)中改變地址欄地址是最恰當(dāng)?shù)模?privatevoidwebBrowser1_Navigated(objectsender,WebBrowserNavigatedEventArgse) { textBox1.Text=webBrowser1.Url.ToString(); }
實(shí)用方法3:設(shè)置單選框
//建議使用執(zhí)行單擊事件的方式來設(shè)置單選框,而不是修改屬性: webBrowser1.Document.GetElementById("RBT_A").InvokeMember("click");
實(shí)用方法4:設(shè)置聯(lián)動(dòng)型下拉列表
//比較常見的聯(lián)動(dòng)型多級下拉列表就是省/市縣選擇了,這種情況下直接設(shè)置選擇項(xiàng)的屬性不會(huì)觸發(fā)聯(lián)動(dòng),需要在最后執(zhí)行觸發(fā)事件函數(shù)才能正常工作:foreach(HtmlElementfins.GetElementsByTagName("option")) { if(f.InnerText=="北京") { f.SetAttribute("selected","selected"); } else { f.SetAttribute("selected",""); } } s.RaiseEvent("onchange");
以上四種方法轉(zhuǎn)于:http://www.survivalescaperooms.com/SkyD/archive/2009/04/23/1441696.html
實(shí)用方法一:在WinForm中相應(yīng)Web事件 假設(shè)HTML源代碼如下:
<html> <body> <inputtype="button"id="btnClose"value="關(guān)閉"/> </body> </html>
HtmlDocumenthtmlDoc=webBrowser.Document; HtmlElementbtnElement=htmlDoc.All["btnClose"]; if(btnElement!=null) { btnElement.click+=newHtmlElementEventHandler(HtmlBtnClose_Click); }
//很簡單吧?那么稍稍高級一點(diǎn)的——我們都知道一個(gè)HTML元素可能有很多各種各樣的事件,而HtmlElement這個(gè)類只給出最常用、共通的幾個(gè)。那么,如何響應(yīng)其他事件呢?這也很簡單,只需要調(diào)用HtmlElement的AttachEventHandler就可以了:
btnElement.AttachEventHandler("onclick",newEventHandler(HtmlBtnClose_Click)); //這一句等價(jià)于上面的btnElement.click+=newHtmlElementEventHandler(HtmlBtnClose_Click);
對于其他事件,把"onclick"換成該事件的名字就可以了。例如:
formElement.AttachEventHandler("onsubmit",newEventHandler(HtmlForm_Submit));
實(shí)用方法二:模擬表單自動(dòng)填寫和提交
假設(shè)有一個(gè)最簡單的登錄頁面,輸入用戶名密碼,點(diǎn)“登錄”按鈕即可登錄。已知用戶名輸入框的id(或Name,下同)是username,密碼輸入框的id是passWord,“登錄”按鈕的id是submitbutton,那么我們只需要在webBrowser的DocumentCompleted事件中使用下面的代碼即可:
HtmlElementbtnSubmit=webBrowser.Document.All["submitbutton"]; HtmlElementtbUserid=webBrowser.Document.All["username"]; HtmlElementtbPasswd=webBrowser.Document.All["password"];if(tbUserid==null||tbPasswd==null||btnSubmit==null) return;tbUserid.SetAttribute("value","smalldust"); tbPasswd.SetAttribute("value","12345678");btnSubmit.InvokeMember("click");
關(guān)于表單的提交,的確還有另一種方法就是獲取form元素而不是button,并用form元素的submit方法:
HtmlElementformLogin=webBrowser.Document.Forms["loginForm"]; //…… formLogin.InvokeMember("submit");
本文之所以沒有推薦這種方法,是因?yàn)楝F(xiàn)在的網(wǎng)頁,很多都在submit按鈕上添加onclick事件,以對提交的內(nèi)容做最基本的驗(yàn)證。如果直接使用form的submit方法,這些驗(yàn)證代碼就得不到執(zhí)行,有可能會(huì)引起錯(cuò)誤。
實(shí)用方法三:調(diào)用腳本
首先是調(diào)用Web頁面的腳本中已經(jīng)定義好的函數(shù)。假設(shè)HTML中有如下javascript:
functionDoAdd(a,b){ returna+b; }
那么,我們要在WinForm調(diào)用它,只需如下代碼即可:
objectoSum=webBrowser.Document.InvokeScript("DoAdd",newobject[]{1,2}); intsum=Convert.ToInt32(oSum);
其次,如果我們想執(zhí)行一段Web頁面中原本沒有的腳本,該怎么做呢?這次.Net的類沒有提供,看來還要依靠COM了。IHTMLWindow2可以將任意的字符串作為腳本代碼來執(zhí)行。
stringscriptline01=@"functionShowPageInfo(){"; stringscriptline02=@"varnumLinks=document.links.length;"; stringscriptline03=@"varnumForms=document.forms.length;"; stringscriptline04=@"varnumImages=document.images.length;"; stringscriptline05=@"varnumScripts=document.scripts.length;"; stringscriptline06=@"alert('網(wǎng)頁的統(tǒng)計(jì)結(jié)果:/r/n鏈接數(shù):'+numLinks+"; stringscriptline07=@"'/r/n表單數(shù):'+numForms+"; stringscriptline08=@"'/r/n圖像數(shù):'+numImages+"; stringscriptline09=@"'/r/n腳本數(shù):'+numScripts);}"; stringscriptline10=@"ShowPageInfo();";stringstrScript=scriptline01+scriptline02+scriptline03+scriptline04+scriptline05+ scriptline06+scriptline07+scriptline08+scriptline09+scriptline10;IHTMLWindow2win=(IHTMLWindow2)webBrowser.Document.Window.DomWindow; win.execScript(strScript,"Javascript");
以上三種實(shí)用方法轉(zhuǎn)于:http://www.survivalescaperooms.com/smalldust/archive/2006/03/08/345561.html
最后:在腳本中調(diào)用WinForm里的代碼,這個(gè)可能嗎?呵呵,當(dāng)然是可能的。 下面的代碼示例演示如何使用ObjectForScripting屬性。在該示例中,ObjectForScripting屬性被設(shè)置為當(dāng)前窗體。
viewsourceprint?
usingSystem; | |
usingSystem.Windows.Forms; |
usingSystem.Security.Permissions; | |
[PermissionSet(SecurityAction.Demand,Name="FullTrust")] | |
[System.Runtime.InteropServices.ComVisibleAttribute(true)] |
publicclassForm1:Form | |
{ |
privateWebBrowserwebBrowser1=newWebBrowser(); | |
privateButtonbutton1=newButton(); |
[STAThread] |
publicstaticvoidMain() | |
{ |
application.EnableVisualStyles(); | |
Application.Run(newForm1()); |
} | |
publicForm1() | |
{ |