我有一個帶有選項卡控件的桌面應用程序(表單),我分配一個選項卡和一個新的自定義webrowser控件。我打開了大約10個這些標籤。每個人訪問大約100 - 500個不同的頁面。如何檢測崩潰tabed webbrowser並處理它?
麻煩的是,如果1個WebBrowser控件有一個問題,它會關閉整個程序。
我希望能夠關閉有問題的WebBrowser控件並打開它的地方一個新的。
是否有我需要訂閱趕上崩潰或反應遲鈍WebBrowser控件任何事件?
我使用C#的窗口上7(表格),.NET框架V4
=========================== ==========================================================
更新:1-選項卡式Web瀏覽器示例
這裏是我有的代碼和我如何以最基本的方式使用webbrowser控件。
- 創建一個新形式的項目並命名SimpleWeb
- 添加一個新類並將其命名爲myWeb.cs,這裏使用的代碼。
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Windows.Forms; using System.Security.Policy; namespace SimpleWeb { //inhert all of webbrowser class myWeb : WebBrowser { public myWeb() { //no javascript errors this.ScriptErrorsSuppressed = true; //Something we want set? AssignEvents(); } //keep near the top private void AssignEvents() { //assign WebBrowser events to our custom methods Navigated += myWeb_Navigated; DocumentCompleted += myWeb_DocumentCompleted; Navigating += myWeb_Navigating; NewWindow += myWeb_NewWindow; } #region Events //List of events:http://msdn.microsoft.com/en-us/library/system.windows.forms.webbrowser_events%28v=vs.100%29.aspx //Fired when a new windows opens private void myWeb_NewWindow(object sender, System.ComponentModel.CancelEventArgs e) { //cancel all popup windows e.Cancel = true; //beep to let you know canceled new window Console.Beep(9000, 200); } //Fired before page is navigated (not sure if its before or during?) private void myWeb_Navigating(object sender, System.Windows.Forms.WebBrowserNavigatingEventArgs args) { } //Fired after page is navigated (but not loaded) private void myWeb_Navigated(object sender, System.Windows.Forms.WebBrowserNavigatedEventArgs args) { } //Fired after page is loaded (Catch 22 - Iframes could be considered a page, can fire more than once. Ads are good examples) private void myWeb_DocumentCompleted(System.Object sender, System.Windows.Forms.WebBrowserDocumentCompletedEventArgs args) { } #endregion //Answer supplied by mo. (modified)? public void OpenUrl(string url) { try { //this.OpenUrl(url); this.Navigate(url); } catch (Exception ex) { MessageBox.Show("Your App Crashed! Because = " + ex.ToString()); //MyApplication.HandleException(ex); } } //Keep near the bottom private void RemoveEvents() { //Remove Events Navigated -= myWeb_Navigated; DocumentCompleted -= myWeb_DocumentCompleted; Navigating -= myWeb_Navigating; NewWindow -= myWeb_NewWindow; } } }
在Form1上拖動一個標準的TabControl,並設置碼頭,以填補,你可以進入選項卡的收集和刪除中的預先填充的標籤,如果你喜歡。
右鍵單擊Form1上,然後選擇「查看代碼」以及與此代碼替換它。
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using mshtml; namespace SimpleWeb { public partial class Form1 : Form { public Form1() { InitializeComponent(); //Load Up 10 Tabs for (int i = 0; i <= 10; i++) { newTab("Test_" + i, "http://wwww.yahoo.com"); } } private void newTab(string Title, String Url) { //Create a new Tab TabPage newTab = new TabPage(); newTab.Name = Title; newTab.Text = Title; //create webbrowser Instance myWeb newWeb = new myWeb(); //Add webbrowser to new tab newTab.Controls.Add(newWeb); newWeb.Dock = DockStyle.Fill; //Add New Tab to Tab Pages tabControl1.TabPages.Add(newTab); newWeb.OpenUrl(Url); } } }
保存並運行該項目。
使用以下答案mo。 ,您可以毫無問題地瀏覽第一個網址,但用戶點擊的所有網址又如何呢?我們如何檢查這些?
我不希望將事件添加到頁面上的每個html元素,必須有一種方法可以在導航之前通過函數OpenUrl運行新的URL,而無需進行無限循環。
謝謝。
現代瀏覽器處理這個由一個單獨的進程運行的每個選項卡。這是*正確*解決方案。 –
這就是爲什麼使用鉻爲每個標籤 –
一個單獨的進程@DavidHeffernan我想說的是,在.NET正確的解決辦法是使用不同的'AppDomain's,而不是過程。 –