Кошмар валидатора для динамического управления C #

У меня есть требование добавить RequiredFieldValidator и RegularExpressionValidator в динамически созданное текстовое поле в динамически созданной ячейке таблицы внутри пользовательского веб-элемента управления в области содержимого страницы, созданной из мастера.

Проблема, как вы, наверное, догадались, заключается в попытке динамически установить свойство ControlToValidate для просмотра моего динамически созданного текстового поля.

После некоторого исследования кода сейчас:

  • Создает панель (как я слышал, ControlToValidate и Validator должны находиться в одном контейнере). Изначально это был заполнитель, но я пытался выполнить предложение, указанное ниже.
  • Создает текстовое поле и устанавливает его идентификатор.
  • Добавляет текстовое поле на панель.
  • Создает RequiredFieldValidator.
  • Устанавливает идентификатор ControlToValidate. Значения, которые я пытался использовать:

    • The ID of the control
    • ClientID элемента управления
    • идентификатор элемента управления с префиксом добавленного текста, который сервер добавляет к дочерним элементам управления пользовательского веб-элемента управления
    • идентификатор клиента изменен таким же образом
    • имя элемента управления (на всякий случай)
    • имя элемента управления с префиксом текста, который сервер добавляет к именам элементов управления
    • с использованием специального рекурсивного метода FindControl в попытке привести новый объект Control в Textbox, а затем с использованием его идентификатора и ClientID
    • Уникальный идентификатор элемента управления
    • то же изменено с префиксом, как описано выше
  • Добавьте валидатор в панель.
  • Добавьте панель в ячейку стола.

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

РЕДАКТИРОВАТЬ: Дальнейшая детективная работа привела меня к тому, что на странице нет проблем, пока не завершится событие page_load. Похоже, что у сервера возникла проблема после того, как код для построения страницы завершил выполнение. Я начинаю задаваться вопросом, действительно ли я добавляю элементы управления в контейнеры именования слишком поздно, а не слишком рано.

Какие-либо предложения?


person Community    schedule 14.05.2009    source источник
comment
Добавляются ли ваши динамические элементы управления во время события PreInit ()?   -  person Josh E    schedule 14.05.2009
comment
только мои 2 цента .. Любые элементы управления, которые создаются динамически, будут потеряны при обратной передаче .. Допустим, вы динамически создаете некоторые поля и кнопки с помощью перечисления .. Чтобы кнопки существовали и могли выполнять событие щелчка, вы должны сделать следующее..   -  person foxtrotZulu    schedule 07.05.2013
comment
1. для целей именования создайте новый идентификатор для каждой кнопки и поля 2. после каждой кнопки сохраните ее новый идентификатор в списке сеансов 3. В списке сеансов захвата page_INIT воссоздайте идентификатор каждой кнопки и поля .. Итак, когда придет время нажимать кнопку , форма стирается, page_INIT воссоздает идентификаторы кнопок и полей, затем выполняется ваш метод btn_click ..   -  person foxtrotZulu    schedule 07.05.2013


Ответы (5)


Как насчет создания пользовательского элемента управления, содержащего текстовое поле и два валидатора? Затем вы можете установить ControlToValidate через Visual Studio, как обычно, а затем динамически добавить этот новый элемент управления в ячейку таблицы.

person pgb    schedule 14.05.2009
comment
Интересная мысль, но это может привести к путанице, поскольку Textbox - это всего лишь один из нескольких вариантов типа управления, которые могут заселять ячейку, и я бы хотел, чтобы код был согласован. Однако я могу быть вынужден попробовать это, если все остальное не поможет. Спасибо за мысль :) - person ; 14.05.2009
comment
Как и предполагалось, получилось действительно запутаться (о чем свидетельствует то, что я пишу это почти через неделю!), Но это единственное, что действительно сработало. Престижность и голос за pgb! - person ; 20.05.2009

Я использовал ретранслятор в похожей ситуации:

<table>
<colgroup>
    <col style="white-space: nowrap;" />
    <col />
    <col />
</colgroup>
<asp:Repeater ID="InputFields" runat="server">
    <ItemTemplate>
        <tr>
            <td class="labelCell">
                <asp:Label id="FieldName" runat="server" Font-Bold="True" Text='<%# Eval("Name") %>'></asp:Label>:
            </td>
            <td class="fieldCell">
                <asp:TextBox id="FieldData" runat="server" autocomplete="off" />
            </td>
            <td class="errorCell">
                <asp:RequiredFieldValidator ID="FieldNameRequiredValidator" runat="server" CssClass="errorValidator" ErrorMessage='<%# Eval("Name") %> is required' 
                    ControlToValidate="FieldData" Display="Dynamic">&nbsp;&nbsp;&nbsp;</asp:RequiredFieldValidator>
                <asp:RegularExpressionValidator ID="FieldNameRegexValidator" runat="server" CssClass="errorValidator" ErrorMessage='A valid <%# Eval("Name") %> is required'
                    ControlToValidate="FieldData" Display="Dynamic" ValidationExpression='<%# Eval("RegEx") %>'>&nbsp;&nbsp;&nbsp;</asp:RegularExpressionValidator>
            </td>
        </tr>
    </ItemTemplate>
</asp:Repeater>

The repeater creates a "naming container" that ensures that the FieldData control ID is unique within the container.

person P.J. Tezza    schedule 14.05.2009

вот пример:

Добавьте элемент управления Panel на свою страницу во время разработки с ID = "PanelHolder" (или вы можете добавить динамически).

затем динамически создавайте элементы управления и добавляйте их на эту панель следующим образом:

var myTextbox = new TextBox() {ID="myTextBox"};
PanelHolder.Controls.Add(myTextBox);
var validator = new RequiredFieldValidator() {ControlToValidate="myTextBox",Display=ValidatorDisplay.Dynamic,ErrorMessage="Required field"}
PanelHolder.Controls.Add(validator);
person Community    schedule 14.05.2009
comment
Я попробую, но разве это не то же самое, что добавить заполнитель и добавить к нему элементы управления? Если нет, то почему? - person ; 14.05.2009
comment
для протокола это не решает проблемы. доблестное усилие. - person ; 14.05.2009

Всего пара вопросов:

  • Является ли элемент управления, отправляющий страницу обратно, проверкой? (если да, убедитесь, что он не в отдельной группе проверки)

  • Вы уверены, что проверки не происходит? Если вы не установите свойство ErrorMessage валидаторов, можно легко подумать, что он ничего не делает. (и я не вижу, чтобы вы добавили его в свой список)

Изменить:

Если вы делаете что-то вроде этого:

        Panel pTest = new Panel();

        TextBox tb = new TextBox();
        for (int i = 0; i < 2; i++)
        {
            tb.ID = "tbDynamicTextBox" + i;
            pTest.Controls.Add(tb );
            RequiredFieldValidator rfv = new RequiredFieldValidator();
            rfv.ControlToValidate = tb.ID;
            rfv.ErrorMessage = "Empty textbox";
            pTest.Controls.Add(rfv);
        }
        cell.Controls.Add(pTest);

Тогда вы получите сообщение об ошибке, так как в коллекцию элементов управления будет добавлен только один экземпляр текстового поля. Если вы переместите TextBox tb = new TextBox (); 'часть внутри цикла, все будет хорошо.

Не уверен, что это ваша проблема, но попробовать стоит.

person Adam Vigh    schedule 14.05.2009
comment
Во-первых, страница не загружается. Так что я почти уверен, что никакой проверки не происходит. Загрузка элемента управления не вызывает обратной передачи. - person ; 14.05.2009
comment
Если страница не загружается, как вы можете быть уверены, что это проблема? - person hunter; 14.05.2009
comment
Причина, по которой страница не загружается, - это тот факт, что при попытке добавить динамический валидатор в коллекцию элементов управления страницы он не может найти текстовое поле, которое должно проверять, поэтому вместо этого страница запускается с сообщением об ошибке загрузки. Для меня это проблема. Я хочу, чтобы страница загружалась с проверяющим текстовым полем. Не сообщение об ошибке .Net. - person ; 14.05.2009
comment
re: редактирование. Это очень интересно. Я попробую это сделать, как только смогу, возможно, завтра на этом этапе. Но это звучит полезно, я буду разочарован, если это не поможет. - person ; 14.05.2009

Я создаю текстовый ящик и валидатор обязательного поля для этого текстового поля внутри сетки.

Сначала я попытался использовать clientID текстового поля в качестве свойства controltovalidate валидатора requiredfield, который не смог найти ошибку управления, чем я дал идентификатор texbox как свойство controltovalidate валидатора requiredfield, и это сработало для меня. Код ниже возвращает RegularExpressionValidator для элемента управления, который задан как первый аргумент для метода.

private RegularExpressionValidator GetRegValidator(string itemId, string regExp)
    {
        RegularExpressionValidator _regVal = new RegularExpressionValidator();
        _regVal.ControlToValidate = itemId;
        _regVal.ValidationExpression = regExp;
        _regVal.ErrorMessage ="PropertyRegexDoesNotMatches";
        _regVal.Text = "*";
        _regVal.SetFocusOnError = true;
        _regVal.EnableClientScript = true;
        _regVal.ID = string.Format("{0}Validator", itemId);
        return _regVal;
    }
person dankyy1    schedule 01.09.2009