我有一个gridview用于显示基于下拉列表中选定值的记录。
在gridview中,在代码后添加了动态数量的绑定字段列,其后是模板字段中的下拉列表和第二个模板字段中的按钮。
问题是,当我单击按钮时,模板字段消失了。
网格视图
<asp:UpdatePanel ID="upnlDetail" runat="server" UpdateMode="Conditional">
<ContentTemplate>
<asp:GridView ID="gvDetails" runat="server"
AutoGenerateColumns="false"
SkinID="gridviewGray"
CellPadding="3"
OnRowCommand="gvDetails_RowCommand"
OnRowDataBound="gvDetails_RowDataBound"
AllowSorting="true">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:DropDownList ID="ddlStatus" runat="server"
AutoPostBack="true"
OnSelectedIndexChanged="ddlStatus_SelectedIndexChanged">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="btnSave" runat="server"
CommandName="Save"
CommandArgument="<%# ((GridViewRow) Container).RowIndex %>"
Text="Save" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
后面的代码
while (gvDetails.Columns.Count > 2) //Don't remove the rightmost columns
{
gvDetails.Columns.RemoveAt(0);
}
gvDetails.DataSource = dt;
gvDetails.DataBind();
方法GridViewTools.CreateBoundField是一个自定义方法,用于设置我的默认boundfield属性并返回BoundField对象。
public static BoundField CreateBoundField(...){...}
在对其进行测试时,gridview会在初始加载时根据需要进行填充。但是,单击该按钮时,不会触发RowCommand事件,并且两个模板字段都将消失。然后,下一个gridview.RowDataBound事件将引发空对象错误,因为在该行中不再找到下拉列表。
如果我删除添加了绑定字段[Columns.Insert]的行,则在单击btnSave并保留模板字段时,将按预期触发RowCommand。如果我再添加一个绑定字段列,RowCommand都不会触发,并且模板字段也会消失。
有什么建议么?为什么将新列添加到gridview会使先前存在的按钮的RowCommand事件无效并使模板字段消失?
相关分类