2010-11-19 5 views
10

Tôi có quyền kiểm soát WebBrowser trên biểu mẫu của mình. Khi tôi cố gắng hướng đến một số trang web tôi nhận được IE trang sai số chuẩn thích:Lỗi tải trang WebBrowser kiểm soát

  • "Navigation đến trang web đã bị hủy bỏ"
  • "Địa chỉ không hợp lệ"
  • "Trang không thể nạp"
  • , vv

tôi cần phải xử lý những sai sót và trở về thông báo lỗi tùy chỉnh để sử dụng. Có cách nào để giải quyết vấn đề này không?

Trả lời

10

Bạn muốn để xử lý các sự kiện NavigateError như here

Edit: bao gồm mã ví dụ từ liên kết:

using System; 
using System.Windows.Forms; 
using System.Runtime.InteropServices; 
using System.Security.Permissions; 

namespace WebBrowserExtensibility 
{ 
    [PermissionSetAttribute(SecurityAction.Demand, Name="FullTrust")] 
    public class Form1 : Form 
    { 
     [STAThread] 
     public static void Main() 
     { 
      Application.Run(new Form1()); 
     } 

     private WebBrowser2 wb = new WebBrowser2(); 
     public Form1() 
     { 
      wb.Dock = DockStyle.Fill; 
      wb.NavigateError += new 
       WebBrowserNavigateErrorEventHandler(wb_NavigateError); 
      Controls.Add(wb); 

      // Attempt to navigate to an invalid address. 
      wb.Navigate("www.widgets.microsoft.com"); 
     } 

     private void wb_NavigateError(
      object sender, WebBrowserNavigateErrorEventArgs e) 
     { 
      // Display an error message to the user. 
      MessageBox.Show("Cannot navigate to " + e.Url); 
     } 
    } 

    public class WebBrowser2 : WebBrowser 
    { 
     AxHost.ConnectionPointCookie cookie; 
     WebBrowser2EventHelper helper; 

     [PermissionSetAttribute(SecurityAction.LinkDemand, Name="FullTrust")] 
     protected override void CreateSink() 
     { 
      base.CreateSink(); 

      // Create an instance of the client that will handle the event 
      // and associate it with the underlying ActiveX control. 
      helper = new WebBrowser2EventHelper(this); 
      cookie = new AxHost.ConnectionPointCookie(
       this.ActiveXInstance, helper, typeof(DWebBrowserEvents2)); 
     } 

     [PermissionSetAttribute(SecurityAction.LinkDemand, Name="FullTrust")] 
     protected override void DetachSink() 
     { 
      // Disconnect the client that handles the event 
      // from the underlying ActiveX control. 
      if (cookie != null) 
      { 
       cookie.Disconnect(); 
       cookie = null; 
      } 
      base.DetachSink(); 
     } 

     public event WebBrowserNavigateErrorEventHandler NavigateError; 

     // Raises the NavigateError event. 
     protected virtual void OnNavigateError(
      WebBrowserNavigateErrorEventArgs e) 
     { 
      if (this.NavigateError != null) 
      { 
       this.NavigateError(this, e); 
      } 
     } 

     // Handles the NavigateError event from the underlying ActiveX 
     // control by raising the NavigateError event defined in this class. 
     private class WebBrowser2EventHelper : 
      StandardOleMarshalObject, DWebBrowserEvents2 
     { 
      private WebBrowser2 parent; 

      public WebBrowser2EventHelper(WebBrowser2 parent) 
      { 
       this.parent = parent; 
      } 

      public void NavigateError(object pDisp, ref object url, 
       ref object frame, ref object statusCode, ref bool cancel) 
      { 
       // Raise the NavigateError event. 
       this.parent.OnNavigateError(
        new WebBrowserNavigateErrorEventArgs(
        (String)url, (String)frame, (Int32)statusCode, cancel)); 
      } 
     } 
    } 

    // Represents the method that will handle the WebBrowser2.NavigateError event. 
    public delegate void WebBrowserNavigateErrorEventHandler(object sender, 
     WebBrowserNavigateErrorEventArgs e); 

    // Provides data for the WebBrowser2.NavigateError event. 
    public class WebBrowserNavigateErrorEventArgs : EventArgs 
    { 
     private String urlValue; 
     private String frameValue; 
     private Int32 statusCodeValue; 
     private Boolean cancelValue; 

     public WebBrowserNavigateErrorEventArgs(
      String url, String frame, Int32 statusCode, Boolean cancel) 
     { 
      urlValue = url; 
      frameValue = frame; 
      statusCodeValue = statusCode; 
      cancelValue = cancel; 
     } 

     public String Url 
     { 
      get { return urlValue; } 
      set { urlValue = value; } 
     } 

     public String Frame 
     { 
      get { return frameValue; } 
      set { frameValue = value; } 
     } 

     public Int32 StatusCode 
     { 
      get { return statusCodeValue; } 
      set { statusCodeValue = value; } 
     } 

     public Boolean Cancel 
     { 
      get { return cancelValue; } 
      set { cancelValue = value; } 
     } 
    } 

    // Imports the NavigateError method from the OLE DWebBrowserEvents2 
    // interface. 
    [ComImport, Guid("34A715A0-6587-11D0-924A-0020AFC7AC4D"), 
    InterfaceType(ComInterfaceType.InterfaceIsIDispatch), 
    TypeLibType(TypeLibTypeFlags.FHidden)] 
    public interface DWebBrowserEvents2 
    { 
     [DispId(271)] 
     void NavigateError(
      [In, MarshalAs(UnmanagedType.IDispatch)] object pDisp, 
      [In] ref object URL, [In] ref object frame, 
      [In] ref object statusCode, [In, Out] ref bool cancel); 
    } 
} 
+0

Tôi sẽ đọc ví dụ và sử dụng nó. Cảm ơn. Ngoài ra còn có một vấn đề khác. Tôi cần xử lý tình huống khi người dùng cố gắng điều hướng đến liên kết với tệp (khi người dùng cố gắng tải xuống tệp) - tôi nên từ chối các yêu cầu đó. Tình huống này cũng có thể được xử lý? –

+0

Nếu bạn cũng xử lý sự kiện Điều hướng, bạn có thể kiểm tra URL - đó sẽ là tên tệp - và đặt thuộc tính Hủy của WebBrowserNavigatingEventArgs thành true nếu đó là tệp chứ không phải trang. Tuy nhiên, điều này phụ thuộc vào việc có thể phân biệt tải xuống tệp từ điều hướng thông thường. – stuartd

+0

Vâng, tôi có thể kiểm tra hầu hết các phần mở rộng tập tin trong mã của tôi (trong trường hợp nếu uri chứa tên tập tin). Nhưng có rất nhiều ví dụ khi máy chủ có thể phản hồi với một số luồng, có thể được phát hiện với trình duyệt như dữ liệu nhị phân và hộp thư mở/lưu/hủy sẽ xuất hiện. Tôi có thể bắt hộp thư này trước khi nó sẽ được hiển thị cho người dùng không? –