Установка значения текстового элемента HTML - PullRequest
0 голосов
/ 16 мая 2010

В программе C # WPF я пытаюсь установить значение элемента HTML Text, который определен:

<input name="tbBName" type="text" id="tbBName" tabindex="1" />

Я попробовал следующее:

mshtml.HTMLDocument doc = (mshtml.HTMLDocument)webBrowser1.Document;
mshtml.HTMLInputTextElement tbName = (mshtml.HTMLInputTextElement)doc.getElementsByName("tbBName");
tbName.value = "Test";

Но я получаю следующее исключение:

Unable to cast COM object of type 'System.__ComObject' to interface type 'mshtml.HTMLInputTextElement'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{3050F520-98B5-11CF-BB82-00AA00BDCE0B}' failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

Я знаю, что он говорит, но я не знаю, какой объект я могу использовать для доступа к текстовому полю.

Что я делаю не так?

Ответы [ 3 ]

0 голосов
/ 16 мая 2010

Вы используете HTML Agility Pack для анализа всего HTML (полученного элементом управления WebBrowser).

Вы можете запросить его, используя синтаксис XPath, и он предоставляетHTML аналогично XmlDocument API.

0 голосов
/ 08 июня 2010

Я считаю, что getElementsByName ненадежен при использовании непосредственно в документе (используя его из C ++)

Итак, наряду с проблемой, упомянутой Одедом о том, что результатом является коллекция, вы можете попробовать что-то вроде следующей структуры. (не проверено / только наброски)

mshtml.HTMLDocument doc = (mshtml.HTMLDocument)webBrowser1.Document;
mshtml.ElementCollection col = doc.getAll();
Dispatch disp = col.namedItem("tbBName");
// in C++ this can return either a collection or an item
try{ // collection
  mshtml.ElementCollection col2 = (mshtml.ElementCollection)disp;
  for( index = 0; index < col2.length; ++index ) {
    mshtml.HTMLInputTextElement tbName = (mshtml.HTMLInputTextElement)col2[index];
    tbName.value = "Test";
}
try{ // item
    mshtml.HTMLInputTextElement tbName = (mshtml.HTMLInputTextElement)disp;
    tbName.value = "Test";
}
0 голосов
/ 16 мая 2010

знаете ли вы, если вы используете JQuery я могу сказать вам, что это очень просто

$('#tbBName').val('value here');
...