网格视图编辑行注册后返回控制

本文关键字:返回 控制 注册 视图 编辑 网格 | 更新日期: 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 事件中查找并注册该控件