2014-01-08 4 views
1

Я понял, что были заданы варианты этого вопроса, и я долгое время изучал их здесь и в других местах, но до сих пор я не могу прийти к решению. Надеюсь, я просто что-то упустил, и кто-то из этого прекрасного сообщества может мне помочь. Я прочитал и попробовал статью MSDN Handling Null Data in Data Source Controls, но также не повезло.GridView DropDownList, обрабатывая нулевые значения

Вот моя ситуация. Я использую EntityDataSource и базу данных SQL Server (если это имеет значение), и у меня есть основная таблица (позволяет называть ее отправлениями), которая ссылается на различные дочерние таблицы через внешний ключ. Например, в пунктах таблицы «Отгрузка» есть столбец «Грузовик», который ссылается на таблицу «Грузовик».

Грузовик не требуется в момент создания Отгрузки. Если пользователь позже редактирует Отгрузку, чтобы добавить Грузовик, все работает отлично. Это делается с помощью DropDownList в GridView поле шаблона, например, так (я извиняюсь, я не знаю, как форматировать этот прелестно - я буду править пост позже, если я могу):

<asp:DropDownList ID="ddlTrucks" runat="server" AutoPostBack="false" AppendDataBoundItems="true" 
         DataTextField="Number" DataValueField="TruckID" DataSourceID="esrcTrucks" 
         SelectedValue='<%# Bind("TruckID") %>'> 
        <asp:ListItem Value="-1" Text="(Select)"></asp:ListItem> 
       </asp:DropDownList> 

Хорошо, поэтому в случае, когда «Грузовик» не был введен во время создания Отгрузки (общий), DropDownList красиво заполняет «(Выбрать)» в качестве выбранного элемента.

ОДНАКО, если Отправка обращается к Грузовику, и этот Грузовик позже удаляется (скажем, он разрушен и больше не является частью флота), вот где я сталкиваюсь с проблемами и получаю «ddlTruck имеет SelectedValue, который недействителен, потому что он не существует в списке элементов. Имя параметра: значение "сообщение об ошибке.

Предпочтительно, я хотел бы избежать этого исключения, так что этого не происходит вообще. Если я должен, однако, есть способ поймать это исключение и «зафиксировать» DDL, чтобы страница могла отображаться, и пользователь мог идти своим путем? Как/где я поймаю это? Итак, я задаю свои вопросы:

  • Является ли это проблемой дизайна базы данных? Должно ли обрабатываться удаление связанного объекта
    каким-то образом, что я не делаю в настоящее время?
  • Есть ли способ предотвратить это исключение вообще, , как если бы ни один грузовик не был введен (DDL показывает только «(Выбрать)»)?
  • Если мне нужно поймать и обработать это исключение, как и где я буду делать так?

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

Любая помощь была бы принята с благодарностью. Я потратил пару дней на это и не смог заставить ничего работать! Если я могу предоставить дополнительную информацию или если я не знаю, что на моем посту, пожалуйста, дайте мне знать.

Большое спасибо!

+0

Также необходимо ли сохранить груз грузовика, который больше не существует или его необходимо обновить? Я предполагаю, что вы хотите, чтобы страница загружалась, а затем пользователь будет обновлять этот DDL с действующим в настоящее время выбором? Это верно? – Dmase05

+0

Не обязательно, чтобы страница GridView/сохраняла предыдущее значение. Отображение пустой строки или другого значения по умолчанию будет прекрасным, поскольку это не обязательное поле (либо в GridView, либо в самой таблице базы данных). – KevinC

ответ

0

Хорошо, к счастью продолжение поиска найдено решение. Поскольку у меня возникли проблемы с этим исключением из-за событий GridView, вместо этого я создал собственный DropDownList WebControl. Затем я переопределял событие PerformDataBinding. Вот общая идея:

[ToolboxData("<{0}:MyDropDownList runat=server></{0}:MyDropDownList>")] 
public class MyDropDownList : DropDownList 
{ 

    protected override void PerformDataBinding(System.Collections.IEnumerable dataSource) 
    { 
     try 
     { 
      base.PerformDataBinding(dataSource); 
     } 
     catch (ArgumentOutOfRangeException ex) 
     { 
      // Handled the exception here 
     } 

    } 
} 

Это решение было найдено на StackOverflow here. Сообщество на этом сайте спасло мне серьезные язвы. Большое спасибо за всю помощь.

0

Вместо того, чтобы устанавливать значение SelectedValue в теге в интерфейсе, попробуйте проверить правильность идентификатора TruckID в файле Page_Load кода, находящегося за файлом, и установить там выбранное значение.

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

protected void Page_Load(Object sender, EventArgs e) 
{ 
    if(!IsPostBack) 
     ddlTrucks.SelectedValue = TruckID != Null ? TruckID : ddlTrucks.Items[0].Value; 
} 
+0

Благодарим за предложение! DropDownLists являются частью шаблона редактирования GridView, поэтому я не думаю, что он будет иметь значение в Page_Load(), поскольку в это время элемент управления не будет существовать? Я пытаюсь найти хорошее событие в GridView, чтобы перейти к такой проверке, но пока события слишком рано (RowEditing - управление еще не заполнено), или я получаю исключение до запуска события (Row DataBound). – KevinC

Смежные вопросы