runat = "server" div вызывает System.Web.HttpException при доступе из коллекции элементов управления - PullRequest
0 голосов
/ 28 марта 2012

У меня есть div, который является runat = "server".Div содержится в панели, а внутри div находятся некоторые элементы управления.Все элементы управления за пределами div (но внутри панели) очищаются, когда я запускаю свой метод ClearControlsInPanel (), который выглядит следующим образом:

public static void ClearControlsInPanel(Panel paneltoclear, string[] ignorelist)
{
    foreach (Control c1 in paneltoclear.Controls)
    {
        if (c1 is TextBox)
        {
            if (!ignorelist.Contains(c1.ID.ToString()))
            {
                ((TextBox)c1).Text = "";
            }
        }
        if (c1 is DropDownList)
        {
            if (!ignorelist.Contains(c1.ID.ToString()))
            {
                ((DropDownList)c1).SelectedIndex = 0;
            }
        }
        //etc.
    }
}

Как только div достигнут, я не вижуэлементы управления в нем, и, следовательно, ни один из этих элементов управления не очищается.По иронии судьбы я нашел парня, который написал сообщение о том же точном , Почему при добавлении runat = server к тегу div возникает исключение типа 'System.Web.HttpException в коллекции элементов управления? Но поток заканчивается, без реального решения или объяснения.

Полное исключение:

base {System.Web.UI.HtmlControls.HtmlContainerControl} = {InnerText = 
'((System.Web.UI.HtmlControls.HtmlContainerControl)
(((System.Web.UI.HtmlControls.HtmlGenericControl)(paneltoclear.Controls._controls
[165])))).InnerText' threw an exception of type 'System.Web.HttpException'}

Пожалуйста, предположите, что это должен быть div сервера runat, и его нельзя изменить напанель.(Я почти уверен, что его замена на панель решит эту проблему, но у нас есть другие требования, которые требуют, чтобы это был серверный сервер runat (длинная история)).

Ответы [ 2 ]

1 голос
/ 28 марта 2012

Панель все равно преобразуется в div, так почему же div? Я не вижу никаких требований к нему, и он решает эту проблему довольно быстро:)

0 голосов
/ 28 марта 2012

Проще, если вы разместите реальный код, который обращается к div. то есть, какая ветвь оператора if на самом деле имеет дело с универсальным контрольным случаем. Я предполагаю, что проблема в том, что вы пытаетесь установить свойство innertext для div (как предполагает исключение). Фокус может заключаться в том, что если у элемента управления div есть дочерние элементы, то свойство innertext не существует, и любой текст представляется в виде литерала в массиве элементов управления элемента управления div?

Итак, чтобы очистить дочернюю коллекцию, попробуйте что-то вроде ... Также лучше, если вы сделаете еще, если против

    public static void ClearControlsInPanel(ControlCollection controls, string[] ignorelist)
    {
        foreach (Control c1 in controls)
        {
            if (c1 is TextBox)
            {
                if (!ignorelist.Contains(c1.ID.ToString()))
                {
                    ((TextBox)c1).Text = "";
                }
            }
            else if (c1 is DropDownList)
            {
                if (!ignorelist.Contains(c1.ID.ToString()))
                {
                    ((DropDownList)c1).SelectedIndex = 0;
                }
            }
            else
            {
                if (c1.HasControls())
                {
                    ClearControlsInPanel(c1.Controls, ignorelist);
                }
            }
        }
    }
...