asp: DropDownList Ошибка: «DropDownList1» имеет значение SelectedValue, которое недопустимо, поскольку его нет в списке элементов - PullRequest
2 голосов
/ 02 сентября 2008

У меня есть веб-сайт asp.net 2.0 с многочисленными элементами управления asp: DropDownList. Элемент управления DropDownList содержит стандартную информацию о городе, штате, округе и т.д. В дополнение к стандартным кодам на сайте также есть пользовательские коды, которые пользователи могут настраивать самостоятельно. Например, раскрывающийся список животных может содержать значения Dog, Cat, Fish, ect ...

Я заполняю DropDownList из таблицы SQL 2005, которую я создал, например, tblCodes

Все отлично работает, и пользователи могут добавлять заказы, используя многочисленные элементы управления DropDownList для выбора элементов из списка.

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

Для всех новых заказов выпадающий список работает нормально. Когда пользователь восстановил старый заказ Я получаю следующую ошибку в коде C # «DropDownList1» имеет значение SelectedValue, которое недопустимо, поскольку его нет в списке элементов. »

Происходит следующее: старый ордер имеет значение поля базы данных Dog, а DropDownList больше не содержит Dog в своем списке, так как пользователь изменил его на K9.

Есть идеи об обходном пути?
Есть ли способ заставить asp: DropDownList принимать элементы, не отмеченные в его списке? Можно ли использовать другой элемент управления?

Ответы [ 8 ]

6 голосов
/ 02 сентября 2008

Я решил ту же самую проблему всего два дня назад. Сначала я переместил код, который устанавливает SelectedValue в обработчик PreRender для DropDownList. Затем я добавляю логику для первой проверки, чтобы увидеть, есть ли значение в выпадающем списке. Если нет, я добавляю это.

Вот мой код. ddSpecialty - мой выпадающий список, заполненный "специальностями" из базы данных. registration.Specialty - это специальность, которую выбрал пользователь, которая может быть или не быть в раскрывающемся списке, поскольку эта конкретная специальность может быть удалена с момента последнего выбора.

protected void ddSpecialty_PreRender(object sender, EventArgs e)
{
    if (!ddSpecialty.Items.Contains(new ListItem(registration.Specialty)))
        ddSpecialty.Items.Add(registration.Specialty);
    ddSpecialty.SelectedValue = registration.Specialty;
}
5 голосов
/ 24 апреля 2009

Мне очень понравился следующий небольшой фрагмент для установки значений DropDownList:

Для данных без привязки (например, элементы, добавленные вручную):

ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(value));

Для привязки данных :

ddl.DataBound += (o,e) => ddl.SelectedIndex = ddl.Items.IndexOf(ddl.Items.FindByValue(value));

Я действительно желаю, чтобы ListControls вообще не выдавал ошибок, когда вы пытаетесь установить значения на что-то, чего нет. В любом случае, по крайней мере, в режиме Release было бы неплохо просто спокойно умереть.

4 голосов
/ 02 сентября 2008

Ваше SelectedValue должно быть уникальным идентификатором, который не меняется. Текстовое значение, отображаемое пользователю, является чем-то отдельным и может изменяться при необходимости, не затрагивая ваше приложение, поскольку вы связываете идентификатор с вашим Заказом, а не отображаемое строковое значение.

2 голосов
/ 02 сентября 2008

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

Я закончил тем, что создал подкласс ddl, перехватив оттуда ошибку и взломав исправление.

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

1 голос
/ 11 апреля 2011
0 голосов
/ 27 января 2012

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

В любом случае, мой обходной путь следующий.

1) Я связываю данные со свойством ToolTip DropDownList

<asp:DropDownList ID="edtDepartureIDKey" runat="server" CssClass="textbox" 
ToolTip='<%# Eval("DepartureIDKey") %>' DataSource="<%# DLL1DataSource() %>" DataTextField="DisplayField" DataValueField="IDKey"
onprerender="edtDepartureIDKey_PreRender">

2) В событии prerender я проверяю доступность данных, и если их нет в списке, я просто добавляю их, затем устанавливаю для selectedindex значение данных, которое я сохранил в свойстве ToolTip

protected void edtDepartureIDKey_PreRender(object sender, EventArgs e)
{
    DropDownList ddl = (sender as DropDownList);
    if (ddl.Items.FindByValue(ddl.ToolTip) == null)
    {
        //I am pulling Departure Data through the ID which is saved in ToolTip, and insert it into the 1st row of the DropDownList
        TODepartureData v = new TODepartureData(DBSERVER.ConnStrName);
        TODeparture d = v.Select(Convert.ToInt32(ddl.ToolTip));
        ddl.Items.Insert(0, new ListItem(d.DeptCode, ddl.ToolTip));
    }
    ddl.Items.FindByValue(ddl.ToolTip).Selected = true;
}

how it looks

0 голосов
/ 23 сентября 2011

Наткнулся на это сам. Как ни странно, ddl.ClearSelection(); не работал. Пришлось использовать ddl.SelectedValue = null

Также заметил, что это должно произойти ПОСЛЕ того, как я уберу элементы из списка ddl.Items.Clear();, что также кажется странным. Установка значения SelectedValue на ноль, а затем очистка элементов по-прежнему выдает ошибку.

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

0 голосов
/ 17 февраля 2009

Попробуйте это:

if (ddl.Items.Contains(new ListItem(selectedFacility)))
    ddl.SelectedValue = selectedFacility;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...