Проблема WebBrowser с именами объектов / свойств с поздним связыванием - PullRequest
5 голосов
/ 13 августа 2010

Существует проблема с использованием вызовов позднего связывания WebBrowser, связанных с генерацией имен объектов / свойств.

Например:

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

не удастся с более чем одним экземпляром элемента управления WebBrowser

в действительности mycontrol объект становится Mycontrol , и скомпилированное приложение vb.net завершится с ошибкой

Участник не найден.(Исключение из HRESULT: 0x80020003 (DISP_E_MEMBERNOTFOUND)) в Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet (Object o, Тип objType, Имя строки, Аргументы объекта [], Строка [], имена_параметров, Логические значения []. CopyBack at)CompilerServices.NewLateBinding.LateGet (Экземпляр объекта, Тип Тип, Строка MemberName, Объект [] Аргументы, Строка [] АргументNames, Тип [] TypeArguments, Boolean [] CopyBack) в Execute () в C: \ Projects \ WebBrowser \ SampleCall.vb: строка 16

Есть ли какие-либо решения для этой проблемы?

Тот же код будет работать с приложением vb6 с несколькими элементами управления WebBrowser

Редактировать: Этот код скомпилированс: Option Strict Off

Ответы [ 2 ]

2 голосов
/ 19 августа 2010

@ bugtussle

Будут работать следующие задания:

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"

Проблема с этим подходом, которая требуется для изменения и повторного тестирования большого количества кода

Если вы посмотрите на метод Microsoft.VisualBasic.CompilerServices.LateBinding.LateGet с помощью утилиты отражателя, то обнаружите, что флаг BindingFlags.IgnoreCase используется в вызове binder.InvokeMember.

Я не уверен, что этот вызов выполняется через COM, и где-то читал, что COM-взаимодействие использует одну версию имени в таблице поиска. Например, если имя параметра было изначально введено в эту таблицу как «MyControl», то будет использоваться эта версия, а не «mycontrol». Я думаю, что из-за этого позже InvokeMember не может найти правильного члена.

0 голосов
/ 19 августа 2010

Попробуйте установить значение другим способом:
WebBrowser1.Document.Forms("Myform").children("mycontrol").Value = "test"

...