编辑:这个问题的一部分已在其他地方得到解答,但我觉得这个帖子提供了更多信息,可能很方便了解
标题几乎说了这一切,但这里有更多信息:
我有一个函数,它使用全局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来查看它是否有效..它没有。
我的程序崩溃,崩溃报告声明崩溃是由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会是怎么回事。也许当集合是空的但我认为有一个不同的例外。
比我想象的那样,也许是因为我正在使用Threads而且我必须使用一个调用。但是http://msdn.microsoft.com/en-us/library/system.windows.forms.htmlelementcollection.aspx说HtmlElementCollections是线程安全的(或者与它无关?)。那个,而且这个函数是静态的,所以我甚至不确定我是否可以调用它。
这么长的故事简短,发生了什么?我该如何解决?
答案 0 :(得分:1)
也许在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);
}
}
}
答案 1 :(得分:0)
我认为您正在尝试将HTMLElement转换为集合。 只是一个猜测。你也可以尝试
HtmlElement hec = _wb.Document.GetElementsByTagName("input");
答案 2 :(得分:0)
我认为你的foreach
导致了这一点。 foreach
必须投身IEnumerable
。在foreach
中使用 var ,如果通过集合实现,则会从IEnumerable<T>
获取类型。
答案 3 :(得分:0)
好的,所以我看了答案,我设法解决了问题。由于某些原因,线程问题。虽然HTMLElementsCollection是线程安全的,但WebBrowser类并非如此,我不得不调用它:
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吗?