网格视图编辑行注册后返回控制
本文关键字:返回 控制 注册 视图 编辑 网格 | 更新日期: 2023-09-27 18:36:31
经过大量的搜索和测试,是时候征求意见了。
更新面板中的 GridView,其中包含在编辑项模板中上载的文件:
<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<asp:GridView ID="GridView1" runat="server" AllowPaging="True" AllowSorting="True"
AutoGenerateColumns="False" OnRowUpdating="GridView1_RowUpdating"
OnRowDataBound="GridView1_RowDataBound" OnRowEditing="GridView1_RowEditing"
OnRowCancelingEdit="GridView1_RowCancelingEdit" OnRowCommand="GridView1_RowCommand" >
<Columns>
<asp:CommandField ShowEditButton="True" ShowDeleteButton="true" >
</asp:CommandField>
<asp:TemplateField HeaderText="Attachment" SortExpression="FileName">
<EditItemTemplate>
<asp:FileUpload ID="FileUpload1" runat="server" /><br />
<asp:Button ID="btnAddAttachment" runat="server" Text="Upload File" CommandName="AddAttachment"
CommandArgument='<%# Bind("ID") %>' />
</EditItemTemplate>
<ItemTemplate>
<a id="ancLink" runat="server" href='<%# "~/Files/" + (DataBinder.Eval(Container.DataItem,"FileName")) %>'
target="_blank">
<asp:Label ID="lblAnchor" runat="server"></asp:Label></a>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
</asp:Content>
然后,对于 EditItemTemplate 中的按钮,添加 RegisterPostBackControl:
protected void GridView1_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
if ((e.Row.RowState == DataControlRowState.Edit) || ((e.Row.RowState & DataControlRowState.Edit) > 0))
{
Button btnAddAttachment = (Button)e.Row.FindControl("btnAddAttachment");
AjaxControlToolkit.ToolkitScriptManager ToolkitScriptManager1 = (AjaxControlToolkit.ToolkitScriptManager)Master.FindControl("ToolkitScriptManager1");
ToolkitScriptManager1.RegisterPostBackControl(btnAddAttachment);
}
}
}
问题是 RegisterPostBackControl 在第一次尝试上传文件时不起作用。如果用户再次编辑同一行,则第二次尝试工作正常。
很可能是因为 RegisterPostBackControl 在第二次回发时生效。
有没有办法让按钮第一次完全回发?
我知道有一种简单的解决方法,但这违背了 UpdatePanel 的目的:
<Triggers>
<asp:PostBackTrigger ControlID="GridView1" />
</Triggers>
由于只有管理员才能进行编辑,因此在代码隐藏中为网格设置PostBackTrigger也是一种选择,但再次违背了更新面板的目的。
欢迎任何建议。
根据很多因素,您可以尝试更新面板选项:
ChildrenAsTriggers="true"
如果您现在需要推出某些内容,它可以作为一种临时解决方法。
根据您的代码,您可以使用默认值UpdatePanel
,因此ChildrenAsTriggers
为 true,UpdateMode
为 Always,因此您每次都应该获得完整的回发。
但是我没有看到您设置 Gridview 的数据源 ID,因此除非您在代码隐藏中的某个地方这样做,否则它不会进行数据绑定。 但是,您最初必须处于编辑模式才能找到您尝试注册的控件。 因此,当您进入编辑模式时,您需要注册控件,请尝试在 gridview RowEditing 事件中查找并注册该控件