Несколько элементов управления с привязкой к данным в одном столбце GridView
У меня есть вид сетки, которая связана с набором данных. В сетке у меня есть столбец DefaultValue, в котором есть три элемента управления - выпадающий список, флажок и текстовое поле. В зависимости от поступающих данных он может переключиться на любой из этих элементов управления. Все достаточно просто, когда нам нужно просто отобразить данные - в событии gridview_prerender я просто делаю один из элементов управления видимым. Элемент управления настроен следующим образом:
<asp:TemplateField HeaderText="Default Value" SortExpression="DefaultValue">
<ItemTemplate>
<asp:TextBox ID="txt_defaultValue_view" runat="server" Text='<%# Bind("DefaultValue") %>' Enabled ="false" />
<asp:DropDownList ID="ddl_defaultValue_view" runat="server" Enabled ="false" />
<asp:CheckBox ID="chk_defaultValue_view" runat="server" Enabled ="false" />
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txt_defaultValue_edit" runat="server" Text='<%# Bind("DefaultValue") %>'/>
<asp:DropDownList ID="ddl_defaultValue_edit" runat="server" />
<asp:CheckBox ID="chk_defaultValue_edit" runat="server" />
</EditItemTemplate>
</asp:TemplateField>
Моя проблема начинается, когда я нахожусь в режиме редактирования, и мне нужно обновить сетку новыми данными. Поскольку только элемент управления textbox связан с данными, событие RowUpdating может получить доступ только к данным из столбца textbox, а все остальные мои данные просто отбрасываются. Я также не могу привязать данные с помощью флажка и элемента управления dropdownlist, так как они могут получить недопустимое исключение типа данных. Итак, кто-нибудь знает, как я могу обновить столбец, который имеет три разных элемента управления, где каждый из этих трех элементов управления может иметь действительные данные?
Спасибо
2 ответа
Во-первых, я бы переключил видимость элементов управления в RowDataBound Grid, а не в PreRender, потому что он может изменяться только в DataBinding, а не при каждой обратной передаче. Вы также можете привязать раскрывающийся список к его источнику данных, изменить проверенное состояние флажка и установить свойство Text для текстового поля в соответствии с элементом данных строки. При обновлении вы можете найти элементы управления с помощью FindControl в RowUpdating и получить их значения (например, Dropdownlist.SelectedValue).
GridView имеет пару событий:
RowUpdating / RowUpdated
RowDeleting / RowDeleted
....
В вашем случае вам нужен RowUpdating - он вызывается непосредственно перед выполнением обновления, поэтому найдите в строке ожидаемый элемент управления (скажем, флажок) и выполните подготовку перед передачей в базу данных.
В качестве другого способа рассмотрим возможность использования ObjectDataSource Updating - это обычный способ указать параметры для выполнения запроса.