C#HTMLElementCollection抛出InvalidCastException

时间:2013-04-24 07:05:36

标签: c# .net

编辑:这个问题的一部分已在其他地方得到解答,但我觉得这个帖子提供了更多信息,可能很方便了解

标题几乎说了这一切,但这里有更多信息:

我有一个函数,它使用全局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是线程安全的(或者与它无关?)。那个,而且这个函数是静态的,所以我甚至不确定我是否可以调用它。

这么长的故事简短,发生了什么?我该如何解决?

4 个答案:

答案 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吗?