如何使用Silverlight / C#删除HtmlElement中的所有子项#

时间:2011-01-20 07:21:47

标签: c# html silverlight

所以我有这个Silverlight应用程序通过 HTML表单提交调用一些报告(.rdlc)。 这个表格是通用的,所以我用它来用它来调用所有的报告。

现在我想在每次提交表单时清除其中的输入元素。

所以,每次我想要一个包含没有孩子的新报告时,我想要一个清晰的表格

当表格中输入数量超过5(或任何更大量的输入)时,有人可以解释为什么这不起作用吗?

    public static void RemoveInputsFromForm(HtmlElement Form)
    {
        if (HtmlPage.Document.GetElementById(Form.Id) != null)
        {
            foreach (HtmlElement element in Form.Children)
            {
                if (element.Id != string.Empty)
                {
                    element.Parent.RemoveChild(element);
                }
            }
        }
    }

表单有ID,每个输入都有一个ID,随机删除一些输入,其他保留在表单中。

这是将输入元素插入到该表单中的方法:

public static void AddInputToForm(HtmlElement Form, string Name, object Data)
    {
        if (Data != null && Data.ToString() != string.Empty)
        {
            var input = HtmlPage.Document.CreateElement("input");
            input.SetProperty("type", "hidden");
            input.SetProperty("value", Data.ToString());
            input.SetProperty("name", Name);
            input.SetProperty("id", Name);
            Form.AppendChild(input);
        }
    }

这是我现在用来删除表单子项的方法,它与AddInputToForm方法仅相同,它删除了输入

 public static void RemoveInputFromForm(HtmlElement Form, string Name)
    {

        if (HtmlPage.Document.GetElementById(Name) != null)
        {
            Form.RemoveChild(HtmlPage.Document.GetElementById(Name));
        }

    }

这是获取表单的方法

  public static HtmlElement GetForm(string formUrl)
    {
        //in the html that holds the silverlight object, you must have a form named "reportform"
        //<form id="reportform" action="" method="post" target="_blank" style="visibility: collapse" />
        HtmlElement functionReturnValue = null;


        //set form
        functionReturnValue = HtmlPage.Document.GetElementById("reportform");

        //set form action
        functionReturnValue.SetProperty("action", formUrl);


        return functionReturnValue;
    }

重现代码(SomeElement是一个具有字符串属性的对象):

           //get form
            var Form = GetForm(ApplicationUrl + @"Reports\Report.aspx");

            //add parameters to form
            AddInputToForm(Form, "id1", SomeElement.Id1Value);
            AddInputToForm(Form, "id2", SomeElement.Id2Value);
            AddInputToForm(Form, "id3", SomeElement.Id3Value);
            AddInputToForm(Form, "id4", SomeElement.Id4Value);
            AddInputToForm(Form, "id5", SomeElement.Id5Value);
            AddInputToForm(Form, "id6", SomeElement.Id6Value);
            AddInputToForm(Form, "id7", SomeElement.Id7Value);
            AddInputToForm(Form, "id8", SomeElement.Id8Value);
            AddInputToForm(Form, "id9", SomeElement.Id9Value);

            //submit form
            Form.Invoke("submit");

            //clean report
            RemoveInputFromForm(Form, "id1");
            RemoveInputFromForm(Form, "id2");
            RemoveInputFromForm(Form, "id3");
            RemoveInputFromForm(Form, "id4");
            RemoveInputFromForm(Form, "id5");
            RemoveInputFromForm(Form, "id6");
            RemoveInputFromForm(Form, "id7");
            RemoveInputFromForm(Form, "id8");
            RemoveInputFromForm(Form, "id9");

所以你看我必须删除我添加的每个孩子尽可能多的电话,因为表格中有输入,我希望只有一个电话并清理那个表格

提前感谢任何给定的解决方案。

2 个答案:

答案 0 :(得分:3)

您不应该在foreach循环内添加或删除元素,因为集合会更改并使循环无效。而是将所有要删除的项目添加到单独的列表中,然后在第二个循环中删除它们。 (我没有测试它,因为我没有相关的示例代码,但这是foreach循环的常见错误。)

List<HtmlElement> toRemove = new List<HtmlElement>();
foreach (HtmlElement element in Form.Children)
{
    if (element.Id != string.Empty)
    {
        toRemove.Add(element);
    }
}
foreach (HtmlElement element in toRemove)
{
    Form.RemoveChild(element);
}

或者,使用第二种方法,您始终可以将所有ID添加到列表中,然后添加循环遍历这些元素的RemoveAllFormInputs()方法。

答案 1 :(得分:0)

Peet已经提供了正确的答案,但是有些人可能更喜欢基于Linq的方法,这种方法可以使代码变得轻松。

foreach (HtmlElement element in Form.Children
                                    .OfType<HtmlElement>
                                    .Where(e => !String.IsNullOrEmpty(e.Id))
                                    .ToList() )
{
    Form.RemoveChild(element);
}