所以我有这个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");
所以你看我必须删除我添加的每个孩子尽可能多的电话,因为表格中有输入,我希望只有一个电话并清理那个表格。
提前感谢任何给定的解决方案。
答案 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);
}