Как добавить пустую первую запись в <asp: DropDownList>?

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

Не могли бы вы прокомментировать, как вы строите остальную часть списка (привязка данных против ddl.Items.Add ())

Rob Allen 13.01.2009 18:09

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

Jay 13.02.2015 20:59
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
2
11 239
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

На странице 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 элемента управления, сделает это. Думаю, это лучшее простое решение.

Mark Brittingham 13.01.2009 18:15

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

Daniel Schaffer 13.01.2009 18:17

+1 (если RequiredFieldValidator не работает, просто используйте CompareValidator)

user39603 13.01.2009 18:17

Как ты можешь это сделать? Я знаю, что вы можете сравнивать значение, но мы бы хотели, чтобы оно провалило сравнение с пустой строкой. Есть способ сделать это?

Daniel Schaffer 13.01.2009 18:21

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

vitule 13.01.2009 20:40

Ах, вам нужно добавить CausesValidation = "true" в раскрывающийся список, чтобы обеспечить соблюдение валидации. Хорошо поймал! Я обновил свой ответ.

Daniel Schaffer 13.01.2009 21:12

Вы также можете добавить строку вручную через конструктор, но вы должны убедиться, что свойство DropDownList AppendDataBoundItems = True, чтобы строки привязки к данным были прикреплены к первой строке.

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

Nasir 13.01.2009 18:42

Хороший момент, я помню, что мне приходилось иметь дело с этим на раннем этапе, когда я впервые начал работать с DDL.

TheTXI 13.01.2009 19:43

Предыдущие ответы касались вставки значения, но я понимаю, что ваша проблема заключается в свойстве AutoPostBack. Я полагаю, вы не хотите возвращать это значение, и это ваша проблема, я прав?

Может быть, есть лучшее решение, но я бы посоветовал не использовать AutoPostBack. Вы можете обрабатывать обратную передачу автоматически, используя событие изменения выбранного значения.

ИМХО, если AutoPostBack работает не так, как вы хотите, всегда лучше реализовать собственное решение, чтобы наложить на него какой-то «патч», чтобы «исправить» это.

надеюсь, это поможет

Благодарю. Но я чувствую, что это должно работать из коробки. При включенном AutoPostBack нет возможности выбрать первую запись. Поэтому вы должны вставить ничего не делающее.

vitule 13.01.2009 18:23

Используйте метод вставки, поскольку другие предлагали добавить элемент с индексом 0 со значением, указывающим, что он не выбран (например, «неизвестно»). Затем используйте валидаторы, добавьте обязательный валидатор поля и установите для свойства InitialValue значение нового элемента списка (в нашем примере - «unknown»).

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

Если пользователь не выберет другой вариант, валидатор предотвратит обратную передачу.

Надеюсь, это то, что вы ищете.

Другие вопросы по теме