2013-04-24 130 views
1

編輯:這個問題的一部分已經在別處回答,但我覺得這個線程提供一些更多的信息,可能是方便知道C#HTMLElementCollection引發InvalidCastException

標題幾乎說明了一切,但這裏是多一些信息:

我有一個函數,它使用全局WebbBowser對象的HTMLdocument來搜索特定對象(即文本框)。當找到該對象時,它將被賦予一個值。

功能如下:

public static void Set_Elements_Input(string element_name, string value) 
    { 
     HtmlElementCollection hec = _wb.Document.GetElementsByTagName("input"); 

     foreach (HtmlElement he in hec) 
     { 
      if (he.GetAttribute("name") == element_name) 
      { 
       he.SetAttribute("value", value); 
      } 
     } 
    } 

因爲情節的我不能在我的編程環境進行調試。所以我必須運行生成的.exe來查看它是否有效。它不。

我的程序崩潰,crashreport指出崩潰是由InvalidcastException引起的。

隨着MessageBox.Show()方法的幫助下,我好不容易纔找到的地步,一切順利香蕉:

 MessageBox.Show("I got here!"); 
     HtmlElementCollection hec = _wb.Document.GetElementsByTagName("input"); 
     MessageBox.Show("I didn't get here!"); 

這令我奇怪,因爲我看不出這是怎麼丟一個InvalidCastException。我知道foreach與演員合作,但我的程序似乎永遠不會達到該代碼。那個,HTMLElementCollection是一個HTMLElements的集合,所以我沒有看到如何處理InvalidCastException。也許當收集是空的,但我認爲這是一個不同的例外。

比我想,也許這是因爲我正在使用線程,我必須使用調用。但http://msdn.microsoft.com/en-us/library/system.windows.forms.htmlelementcollection.aspx表示HtmlElementCollections是線程安全的(或者與它無關?)。那個,而且這個函數是靜態的,所以我甚至不確定我是否可以調用。

這麼長的故事,發生了什麼?我該如何解決它?

+2

這可能有所幫助: http:// stackoverflow。com/questions/12386071/threading-and-webbrowser-control – Kai 2013-04-24 07:12:52

+0

這似乎是同一個問題的確。我會嘗試並報告。 – Jordy 2013-04-24 07:16:10

回答

1

也許發現aswer這裏Threading and webbrowser control

_wb.Invoke(new Action(() => { 

    HtmlElementCollection hec = _wb.Document.GetElementsByTagName("input"); 

    foreach (HtmlElement he in hec) 
    { 
     if (he.GetAttribute("name") == element_name) 
     { 
      he.SetAttribute("value", value); 
     } 
    } 
} 
0

我認爲你正試圖HTML元素轉換爲集合。 只是一個猜測。你也可以嘗試

HtmlElement hec = _wb.Document.GetElementsByTagName("input"); 
+0

查看方法名稱'GetElement ** s ** ByTagName' – I4V 2013-04-24 07:25:08

0

我認爲你的foreach導致這一點。 foreach不得不投到IEnumerable上工作。使用varforeach將採用IEnumerable<T>的類型(如果它是通過集合實現的)。

+0

但是,如何導致InvalidCastException?在foreach中,我檢查每個定義是HTMLElement的HTMLElementCollection的所有成員。 – Jordy 2013-04-24 07:44:53

0

好吧,我已經看了答案,我設法解決了這個問題。由於某些原因,線程是問題。雖然HTMLElementsCollection是線程安全的,web瀏覽器類不是,所以我不得不調用它:

public static void Set_Elements_Input(string element_name, string value) 
    { 
     if (_wb.InvokeRequired) 
     { 
      _wb.Invoke(new Action(() => { Set_Elements_Input(element_name, value); })); 
     } 
     else 
     { 
      HtmlElementCollection hec = _wb.Document.GetElementsByTagName("input"); 

      foreach (HtmlElement he in hec) 
      { 
       if (he.GetAttribute("name") == element_name) 
       { 
        he.SetAttribute("value", value); 
       } 
      } 
     } 
    } 

但沒有人知道爲什麼原來的代碼會拋出一個InvalidCastException?

相關問題