2011-01-20 5 views
0

Итак, у меня есть приложение Silverlight, которое вызывает некоторые отчеты (.rdlc) через HTML-форму отправить. Эта форма является универсальной, поэтому я использую ее для вызова всех отчетов.Как удалить всех детей в HtmlElement с помощью Silverlight/C#

Теперь я хочу очистить входные элементы в нем каждый раз, когда форма была отправлена.

Так что я хочу четкую форму каждый раз, я хочу, чтобы вызвать новый отчет с нет детей в нем.

Может ли кто-нибудь объяснить, почему это не работает, если в форме имеется более 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); 
       } 
      } 
     } 
    } 

Форма имеет это идентификатор и каждый вход имеет идентификатор, он удаляет некоторые входы случайно, другие оставаться в форме.

Это метод, который вставляет входные элементы в таком виде:

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? Звучит здорово, мне бы хотелось увидеть образец. –

+0

Весь код, в котором вы нуждаетесь, находится в этом сообщении, вам просто нужно прочитать параметры запроса на странице aspx, содержащей файл .rdlc.Я сериализую объект и десериализую его на странице aspx. – Rumplin

ответ

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); 
} 

В качестве альтернативы, используя свой второй подход, вы всегда можете добавить все ваши идентификаторы к и затем добавьте метод RemoveAllFormInputs(), который перемещается по этим элементам.

+0

Я только что протестировал этот код, и он отлично работает. Благодаря! – Rumplin

0

Peet предоставил правильный ответ, однако некоторые из них могут предпочесть подход, основанный на Linq, который уменьшает код litte.

foreach (HtmlElement element in Form.Children 
            .OfType<HtmlElement> 
            .Where(e => !String.IsNullOrEmpty(e.Id)) 
            .ToList()) 
{ 
    Form.RemoveChild(element); 
} 
Смежные вопросы