2009-05-14 3 views
3

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

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

После некоторых исследований код Сейчас:

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

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

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

EDIT: Дальнейшая детективная работа привела меня к тому, что страница не имеет проблемы до завершения события page_load. Кажется, что у сервера возникла проблема после завершения выполнения кода для построения страницы. Я начинаю задаваться вопросом, действительно ли я добавляю элементы управления в именования контейнеров слишком поздно, а не слишком рано.

Любые предложения?

+0

Включены ли ваши динамические элементы управления во время события PreInit()? –

+0

Нет. Это не так. Зачем? – 2009-05-14 15:51:53

+0

только мои 2cents..Any элементы управления, которые динамически создаются, будут потеряны в postback..Lets говорят, что вы динамически создаете некоторые поля и кнопки через перечисление. Для того чтобы кнопки существовали и имели возможность выполнить событие click, вы должны сделайте следующее .. – foxtrotZulu

ответ

1

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

+0

Интересная мысль, но это может стать беспорядочным, так как «Текстовое поле» - это всего лишь один из нескольких вариантов типа управления, которые * могут * поселиться в ячейке, и я хочу, чтобы код desig был согласован. Однако я могу быть вынужден попробовать это, если все остальное не удастся. Спасибо за мысль :) – 2009-05-14 12:01:50

+0

Как и было предсказано, это стало действительно беспорядочным (о чем свидетельствует то, что через неделю я написал это!), Но это единственное, что действительно сработало. Kudos и upvote к pgb! – 2009-05-20 15:35:44

+0

Приятно слышать, что вы работали. – pgb

0

вот пример:

Добавьте элемент управления 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); 
+0

Я попробую, но разве это не по сути то же самое, что добавлять заполнитель и добавлять элементы управления к этому? Если нет, почему бы и нет? – 2009-05-14 12:00:14

+0

для записи это не решает проблему. отважное усилие. – 2009-05-14 12:22:09

0

Просто пара вопросов:

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

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

Edit:

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

 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(); «Часть внутри цикла tho, все будет хорошо.

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

+0

Страница не загружается в первую очередь. Поэтому я почти уверен, что проверка не происходит. Контрольная загрузка не вызывает обратной передачи. – 2009-05-14 12:09:38

+0

Если страница не загружается, как вы можете быть уверены, что это проблема? – hunter

+0

Причиной того, что страница не загружается, является тот факт, что при попытке добавить динамический валидатор в контрольную коллекцию страницы он не может найти текстовое поле, которое оно должно проверять, в результате чего страница оборвалась с сообщением об ошибке вместо загрузки. Это проблема для меня. Я хочу, чтобы страница загружалась с помощью проверочного текстового поля. Не сообщение об ошибке .Net. – 2009-05-14 13:06:23

1

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

<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> 

Повторитель создает «именования контейнер», который гарантирует, что FieldData управления ID является уникальным в пределах контейнера.

0

Я создаю валидатор texbox и validfield для этого texbox внутри сетки.

Я первый попытался использовать ClientId TextBox как ControlToValidate свойства requiredfield валидатора этих даваемыми не смогли найти ошибку управления, чем я даваемую ID texbox как ControlToValidate свойства requiredfield валидатора и он работал me.The ниже код возвращает 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; 
    }