我有一个网格视图,它是绑定到数据集的数据。在网格中,我有一个列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>
我的问题在我处于编辑模式时开始,我需要使用新数据更新网格。由于只有文本框控件是数据绑定的,因此RowUpdating事件只能访问文本框列中的数据,而我的所有其他数据都会被丢弃。我也无法使用checkbox和dropdownlist控件进行数据绑定,因为它们可能会获得无效的数据类型异常。那么,是否有人知道如何更新具有三个不同控件的列,其中这三个控件中的每一个都可能具有有效数据?
由于
答案 0 :(得分:3)
首先,我会切换网格RowDataBound中控件的可见性,而不是PreRender,因为它只能在DataBinding上更改,而不能在每次回发时更改。 您还可以将Dropdown绑定到其数据源,更改Checkbox的checked-state,并根据Row的Dataitem设置Textbox的Text-property。 更新时,您可以使用RowUpdating中的FindControl查找控件并获取其值(f.e.Dropdownlist.SelectedValue)。
答案 1 :(得分:1)
GridView有一对事件:
RowUpdating / RowUpdated
RowDeleting / RowDeleted
...
在您的情况下,您需要RowUpdating - 在执行更新之前调用,因此在行中找到预期控件(说复选框)并在传递到数据库之前进行准备
另一种方式是审查使用ObjectDataSource事件更新的可能性 - 通常的方法是为查询执行指定参数。