Как удалить все дочерние элементы в HtmlElement с помощью Silverlight / C # - PullRequest
0 голосов
/ 20 января 2011

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

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

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

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

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

Заранее спасибо любому решению.

Ответы [ 2 ]

3 голосов
/ 20 января 2011

Никогда не следует добавлять или удалять элементы, находясь внутри цикла 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 голосов
/ 20 января 2011

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

foreach (HtmlElement element in Form.Children
                                    .OfType<HtmlElement>
                                    .Where(e => !String.IsNullOrEmpty(e.Id))
                                    .ToList() )
{
    Form.RemoveChild(element);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...