У меня есть раскрывающийся список, у меня есть источник данных, у меня AutoPostBack установлен на true.
Я хочу добавить первую запись в источник данных, которая говорит что-то вроде «--- выберите страну ---», и выбор этой записи не вызовет обратной передачи.
Кажется, это должно быть легко сделать, но я не могу найти хорошее решение.
Спасибо.
Вы действительно хотите, чтобы не выполнялась обратная передача, если пользователь выбирает запись «Пожалуйста, выберите»? Что делать, если пользователь выбирает другую запись, а затем снова переключается на «пожалуйста, выберите». Разве ты не хочешь это признать? Конечно, я ничего не знаю о вашем приложении, но то, что вы здесь говорите, возможно, имеет смысл в контексте. (И я заметил, что задаю этот вопрос через 5 лет после первоначальной публикации. Надеюсь, вы уже поняли это!)





На странице aspx (важная часть - это обработка события DataBound и установка CausesValidation = "true" для принудительной проверки раскрывающегося списка):
<asp:DropDownList ID = "ddlCountries" runat = "server" DataSourceID = "dsCountries" AutoPostBack = "true" OnDataBound = "ddlCountries_DataBound" CausesValidation = "true" />
<asp:RequiredFieldValidator ID = "rfvCountries" runat = "server" ControlToValidate = "ddlCountries" Display = "Dynamic" ErrorMessage = "Please select a country." />
В вашем выделенном коде (важно, чтобы значение вставленного элемента было String.Empty, чтобы требуемый валидатор поля работал!):
protected void ddlCountries_DataBound(Object sender, EventArgs e)
{
ddlCountries.Items.Insert(0, new ListItem("--- select country ---", String.Empty));
}
Примечание: Если вы не хотите, чтобы сообщение валидатора отображалось, установите для свойства «Display» значение «None».
+1 Это не заботится о желании не иметь обратной передачи только для одного элемента, но я не уверен, что какое-либо решение, кроме обширного перенастройки Javascript элемента управления, сделает это. Думаю, это лучшее простое решение.
Я обновил свой ответ, включив в него валидатор, который должен позаботиться о том, чтобы не отправлять обратно один элемент.
+1 (если RequiredFieldValidator не работает, просто используйте CompareValidator)
Как ты можешь это сделать? Я знаю, что вы можете сравнивать значение, но мы бы хотели, чтобы оно провалило сравнение с пустой строкой. Есть способ сделать это?
Итак, я отказался от принятия этого ответа. RequiredFieldValidator отображает текст ошибки, когда я выбираю элемент «- выберите страну -», но все равно вызывает обратную передачу.
Ах, вам нужно добавить CausesValidation = "true" в раскрывающийся список, чтобы обеспечить соблюдение валидации. Хорошо поймал! Я обновил свой ответ.
Вы также можете добавить строку вручную через конструктор, но вы должны убедиться, что свойство DropDownList AppendDataBoundItems = True, чтобы строки привязки к данным были прикреплены к первой строке.
Вы должны быть осторожны с этим. Убедитесь, что вы не привязываете данные каждый раз при загрузке страницы, в противном случае раскрывающийся список будет добавляться при каждой загрузке страницы.
Хороший момент, я помню, что мне приходилось иметь дело с этим на раннем этапе, когда я впервые начал работать с DDL.
Предыдущие ответы касались вставки значения, но я понимаю, что ваша проблема заключается в свойстве AutoPostBack. Я полагаю, вы не хотите возвращать это значение, и это ваша проблема, я прав?
Может быть, есть лучшее решение, но я бы посоветовал не использовать AutoPostBack. Вы можете обрабатывать обратную передачу автоматически, используя событие изменения выбранного значения.
ИМХО, если AutoPostBack работает не так, как вы хотите, всегда лучше реализовать собственное решение, чтобы наложить на него какой-то «патч», чтобы «исправить» это.
надеюсь, это поможет
Благодарю. Но я чувствую, что это должно работать из коробки. При включенном AutoPostBack нет возможности выбрать первую запись. Поэтому вы должны вставить ничего не делающее.
Используйте метод вставки, поскольку другие предлагали добавить элемент с индексом 0 со значением, указывающим, что он не выбран (например, «неизвестно»). Затем используйте валидаторы, добавьте обязательный валидатор поля и установите для свойства InitialValue значение нового элемента списка (в нашем примере - «unknown»).
Установите индекс 0 как выбранный элемент при загрузке страницы, а если нет - при обратной передаче.
Если пользователь не выберет другой вариант, валидатор предотвратит обратную передачу.
Надеюсь, это то, что вы ищете.
Не могли бы вы прокомментировать, как вы строите остальную часть списка (привязка данных против ddl.Items.Add ())