Как подавить исключение ArgumentOutOfRangeException, когда выбранное значение не существует в dataset

#c# #asp.net #drop-down-menu #objectdatasource

#c# #asp.net #выпадающее меню #objectdatasource

Вопрос:

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

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

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

Мне понравился ответ, приведенный в другом сообщении, предлагающем добавить запись вручную красным цветом, но я не уверен, где / как это сделать. Нужно ли мне настроить обработчик событий на кодовой странице, чтобы перехватить эту ошибку. Это слишком поздно?

Любая помощь / предложения будут приняты с благодарностью.

Спасибо, Патрик

Комментарии:

1. Это означает, что вы разрешаете «удалять» местоположения, хотя они все еще используются? Похоже на ошибку. Все зависимые объекты также должны быть «удалены».

2. я хочу сказать, что запись физически не удаляется из таблицы. Если под ошибкой вы подразумеваете, что любой идентификатор местоположения в любых связанных таблицах не обновляется до значения null, тогда да. В этом случае соответствующая запись не должна быть удалена, а скорее iLocationId должен быть либо обновлен до null, либо пользователю потребуется обновить это поле при следующем открытии reocrd в пользовательском интерфейсе. Вот почему я хотел бы иметь возможность перехватить событие привязки SelectedValue и либо продолжить, либо предоставить дополнительную логику. К сожалению, MS решила за меня, не реализовав обработчик событий для этого.

3. @user: я имел в виду, что вам следовало избегать того, что кто-то может «удалить» местоположение, которое все еще используется, или также «удалить» связанные записи (пометить их как удаленные подобным образом bDeleted ). Вы не должны использовать исключения для обработки обычного поведения. Вам следует изменить команду SelectCommand для выпадающего списка, чтобы получить также местоположения, которые «удалены», но также все еще где-то используются. Затем вы можете проверить, удалено ли местоположение, и применить другой css-класс к удаленным элементам списка (Locations). DropDownList1.Items[1].Attributes.Add("class", "deleted"); Редактировать: Сделал ответ из этого комментария.

Ответ №1:

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

 Combobox.FindByText(someText).Selected = true;
  

или

 Combobox.FindByValue(someValue).Selected = true;
  

Ответ №2:

Вам следовало избегать того, что кто-то может «удалить» местоположение, которое все еще используется, или «удалить» также связанные записи (пометить их как удаленные подобным образом bDeleted ).

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

Вам следует изменить команду SelectCommand для выпадающего списка, чтобы получить также местоположения, которые «удалены», но также все еще где-то используются. Затем вы можете проверить, удалено ли местоположение, и применить другой css-класс к удаленным элементам списка (Locations):

DropDownList1.Items[1].Attributes.Add("class", "deleted");