Доступ к данным с помощью элементов управления источником данных (DataSource) в ASP.NET 2.0 - Используем выпадающий список (Drop-Down List) вместо текстового поля (TextBox)
ОГЛАВЛЕНИЕ
Используем выпадающий список (Drop-Down List) вместо текстового поля (TextBox)
Для определенных текстовых полей наличие TextBox не будет иметь никакого смысла. Поле CategoryID как раз является примером этого. В таблице Products базы данных каждому товару назначается категория при помощи поля CategoryID. Таблица Categories содержит запись для каждой существующей категории. При редактировании данных при помощи GridView, используя стандартный интерфейс редактирования TextBox, пользователь должен отредактировать категорию, вписав соответствующее значение CategoryID. Такой интерфейс не является наиболее удобным, так как он предполагает, что пользователь знает значение ID категории. Более того, если пользователь введет неправильное значение ID (то есть такое ID , которое не совпадет со значением записи в таблице Categories) и нажмет кнопку обновления (Update), то будет создана исключительная ситуация из-за ограничения по внешнему ключу между таблицами Products и Categories.
Уже ясно то, что нам нужен интерфейс получше. Для такого просмотра данных наиболее приемлемым будет использование выпадающего списка. Мы хотим, чтобы наш DropDownList перечислял все возможные категории и автоматически выбирал категорию редактируемого товара. После этого пользователь может изменить категорию товара, выбрав другую из списка.
Для начала создайте TemplateField либо преобразуйте существующий CategoryID, принадлежащий BoundField, в TemplateField. Далее отредактируйте EditItemTemplate таким образом, чтобы оно содержало только элемент управления DropDownList. Из смарт-тега DropDownList привяжите его к новому элементу SqlDataSource , который возвращает колонки CategoryID и CategoryName из таблицы Categories, отсортированной по CategoryName. Если вы посетите страницу в этот момент и отредактируете запись, то вы увидите выпадающий список, заполненный категориями; тем не менее, конкретная категория товара не будет выбрана, и, более того, когда вы сохраните товар, она исчезнет из списка!
Данное поведение существует потому, что нам еще предстоит применить двустороннюю привязку данных к DropDownList. Без данной информации GridView не выберет соответствующий элемент в списке при нажатии кнопки редактирования (Edit). Когда запись обновлена, отсутствуие синтаксиса двусторонней привязки в результате приравняет значение CategoryID к NULL. Поскольку SelectCommand элемента SqlDataSource использует INNER JOIN для Products и Categories, любые товары без соответствующей категории не будут возвращены запросом и тем самым не будут отображены в табличной сетке.
Для того, чтобы решить эту проблему, мы используем двустороннюю привязку данных для привязки CategoryID к свойству SelectedValue элемента DropDownList. Следующий декларативный синтаксис демонстрирует EditItemTemplate для колонки CategoryID. Заметьте что существуют DropDownList и элемент SqlDataSource, который возвращает набор всех категорий. Также исследуйте двустороннюю привязку данных, используемую в разметке элемента DropDownList.
<EditItemTemplate>
<asp:DropDownList ID="CategoriesDDL" runat="server" DataSourceID="CategoriesDataSource"
DataTextField="CategoryName" DataValueField="CategoryID" SelectedValue='<%# Bind("CategoryID") %>'>
</asp:DropDownList>
<asp:SqlDataSource ID="CategoriesDataSource" runat="server" ConnectionString="<%$ ConnectionStrings:NorthwindConnectionString %>"
SelectCommand="SELECT [CategoryID], [CategoryName] FROM [Categories] ORDER BY [CategoryName]">
</asp:SqlDataSource>
</EditItemTemplate>
