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