1

我有一个网格视图,它是绑定到数据集的数据。在网格中,我有一列 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 事件只能访问文本框列中的数据,而我的所有其他数据都会被丢弃。我也无法使用复选框和下拉列表控件进行数据绑定,因为它们会获得无效的数据类型异常。那么,有谁知道如何更新具有三个不同控件的列,这三个控件中的每一个都可能具有有效数据?

谢谢

4

2 回答 2

3

首先,我会在 Grid 的RowDataBound中切换控件的可见性,而不是在 PreRender 上,因为它只能在 DataBinding 上更改,而不是在每次回发时更改。您还可以将下拉菜单绑定到其数据源,更改复选框的选中状态并根据行的数据项设置文本框的文本属性。当您更新时,您可以在RowUpdating中使用 FindControl 找到您的控件 并获取它们的值(fe Dropdownlist.SelectedValue)。

于 2010-06-25T15:38:31.360 回答
1

GridView 有一对事件:

行更新/行更新

行删除/行删除

……

在您的情况下,您需要 RowUpdating - 在执行更新之前调用,因此在行中查找预期控件(例如复选框)并在传递到数据库之前进行准备

作为另一种方式查看使用 ObjectDataSource 事件更新的可能性 - 这是为查询执行指定参数的常用方式。

于 2010-06-25T15:32:51.423 回答