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

所以我有这个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方法,它与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" //
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"); 

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

在此先感谢任何给定的解决方案。

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

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

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

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

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