2011-01-20 40 views
0

因此,我有此Silverlight應用程序通過HTML窗體提交調用某些報告(.rdlc)。 這種形式是通用的,所以我用它來調用所有的報告。如何使用Silverlight/C刪除HtmlElement中的所有子項目#

現在我想清除輸入元素在它每次表單已被submited。

所以我希望有一個明確的形式每次我想打電話給在它沒有孩子一份新的報告。

任何人都可以解釋爲什麼當表單中有超過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

因此,您有一個Silverlight應用程序動態構建HTML表單來檢索RDLC報告?聽起來很酷,我很想看到一個樣本。 – 2011-01-20 08:02:32

+0

您需要的所有代碼都在這篇文章中,您只需讀取包含.rdlc文件的aspx頁面上的請求參數即可。我會序列化對象並在aspx頁面中反序列化它。 – Rumplin 2011-06-15 12:34:07

回答

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()方法。

0

Peet提供了正確的答案,但有些人可能更喜歡基於Linq的方法,將代碼細化爲一個小塊。

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