2010-08-13 10 views
5

Có vấn đề với việc sử dụng các cuộc gọi liên kết cuối WebBrowser liên quan đến việc tạo tên đối tượng/thuộc tính.Vấn đề về WebBrowser với đối tượng/tên thuộc tính Bind muộn

Ví dụ:

WebBrowser1.Document.DomDocument.Forms.Myform.mycontrol.Value = "test" 

sẽ thất bại với nhiều hơn một thể hiện của sự kiểm soát WebBrowser

những gì thực sự xảy ra là MyControl đối tượng trở thành myControl và ứng dụng vb.net biên soạn sẽ thất bại có lỗi

Không tìm thấy thành viên. (Ngoại lệ từ HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND)) tại Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet (Đối tượng o, Nhập objType, Tên chuỗi, Object [] args, String [] tên, Boolean [] CopyBack) tại Microsoft .VisualBasic.CompilerServices.NewLateBinding.LateGet (Object Instance, Kiểu Type, String MemberName, Object [] Đối số, String [] ArgumentNames, Nhập [] TypeArguments, Boolean [] CopyBack) tại Execute() trong C: \ Projects \ WebBrowser \ SampleCall.vb: line 16

Có giải pháp nào cho vấn đề này không?

Cùng mã sẽ làm việc với các ứng dụng vb6 với nhiều WebBrowser kiểm soát

Chỉnh sửa: Mã này được comipled với: Option Strict Tắt

Trả lời

0

Hãy thử thiết lập giá trị theo một cách khác:
WebBrowser1.Document.Forms("Myform").children("mycontrol").Value = "test"

2

@ bugtussle

Bài tập tiếp theo sẽ hoạt động:

WebBrowser1.Document.Forms("Myform").Children("mycontrol").InnerText = "test" 
WebBrowser1.Document.DomDocument.Forms("Myform").all("mycontrol").Value = "test" 
WebBrowser1.Document.DomDocument.Forms.Myform.all.mycontrol.Value = "test" 

Vấn đề với phương pháp này đó là cần thiết để thay đổi và kiểm tra lại rất nhiều mã

Nếu bạn có một cái nhìn vào phương pháp Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet sử dụng tiện ích phản xạ, bạn có thể thấy rằng BindingFlags. Cờ IgnoreCase được sử dụng trong binder.InvokeMember gọi.

Tôi không biết rằng cuộc gọi này được thực hiện thông qua COM và đang đọc ở đâu đó rằng COM interop đang sử dụng một phiên bản của tên trong bảng tra cứu. Giống như tên tham số ban đầu được nhập vào bảng đó là "MyControl" so với phiên bản này sẽ được sử dụng, không phải "mycontrol". Tôi nghĩ vì điều đó sau này trên InvokeMember là không tìm được thành viên chính xác.