2010-05-16 73 views
0

在C#WPF程序我'嘗試設置其上定義一個HTML元素Text值:設置HTML文本元素值

<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)).

我知道它說什麼,但我不知道我可以使用哪個對象來訪問文本框。

我在做什麼錯?

回答

0

您使用HTML Agility Pack解析完整的HTML(由WebBrowser控制原樣)。

您可以使用XPath語法來查詢它,並以類似於XmlDocument API的方式公開HTML。

+0

謝謝你Oded我會看看這個包。 但我沒有一個簡單的方法與我正在嘗試的代碼? – Gpx 2010-05-16 07:03:02

+0

@Gpx - 不確定。我注意到的一件事是你正在得到一個_collection_('getElementsByName'返回一個集合),你試圖強制它成爲一個單一的元素。嘗試選擇第一個結果。 – Oded 2010-05-16 07:39:00

+0

On mshtml.HTMLElementCollection collection =(mshtml.HTMLElementCollection)document.getElementsByName(「tbName」); 我得到同樣的例外。 – Gpx 2010-05-16 08:00:08

0

你知道,如果你使用jQuery 我可以告訴你,它很容易

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

嘿穆斯塔法, 我不能夠訪問的一頁的代碼和我不想要寫jQuery的東西。 它是一個用excel文件中的值填充頁面的texboxes的工具。 所以你有任何C#的想法? – Gpx 2010-05-16 06:56:53

0

我發現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"; 
}