【发布时间】:2018-09-19 07:32:00
【问题描述】:
我有一个网格视图,用于根据下拉列表中的选定值显示记录。
在 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.Columns.Insert(0, GridViewTools.CreateBoundField(
"Request.Amount", "Amount", "Money", 50));
gvDetails.Columns.Insert(0, GridViewTools.CreateBoundField(
"Request.CustomerName", "Customer", "comment", 200));
gvDetails.Columns.Insert(0, GridViewTools.CreateBoundField(
"Request.BillAccountFormatted", "Account", "text", 100));
gvDetails.Columns.Insert(0, GridViewTools.CreateBoundField(
"Request.Id", "Request", "int", 50));
gvDetails.DataSource = dt;
gvDetails.DataBind();
方法 GridViewTools.CreateBoundField 是一个自定义方法,它设置我的默认 boundfield 属性并返回 BoundField 对象。
public static BoundField CreateBoundField(...){...}
在对其进行测试时,gridview 会在初始加载时根据需要填充。但是,RowCommand 事件不会触发,并且在单击按钮时两个模板字段都会消失。下一个 gridview.RowDataBound 事件然后引发空对象错误,因为在该行中不再找到下拉列表。
如果我删除添加绑定字段 [Columns.Insert] 的行,当单击 btnSave 并且模板字段持续存在时,RowCommand 会按预期触发。如果我再次添加单个绑定字段列,则不会触发 RowCommand 并且模板字段会消失。
有什么建议吗?为什么向 gridview 添加新列会使预先存在的按钮的 RowCommand 事件无效并使模板字段消失?
更新 我已经从 Grid View 声明中删除了模板字段,并将控件添加到绑定字段,但仍然得到相同的结果。初始加载时显示,但单击后消失。
我还查看了 Page_Unload 事件中的网格视图,它仍然包含当时的列,即使它们没有显示在屏幕上。在 Page_Unload 之后我可以捕获任何事件吗?
【问题讨论】:
-
是您帖子中关于页面加载的代码吗?
-
fwiw, here's 一个非常老的帖子,有类似的问题。一个人说这是一个无法修复的错误,另一个人的解决方案类似于 VDWWD 的。 “我的解决方案是使用 Columns.Add 方法添加我的动态列,然后还以编程方式添加应遵循的列(而不是在 aspx html 中定义它们)。”
-
后面的代码在页面加载事件调用的方法中。页面加载后一切都按预期显示。
标签: c# asp.net gridview webforms