gridview编辑行RegisterPostBackControl

时间:2015-01-07 14:27:13

标签: c# asp.net gridview

经过大量的搜索和测试,是时候征求意见了 更新面板中的GridView,在EditItemTemplate中上传文件:

 <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也是一个选项,但是再次失败了更新面板的目的。
欢迎任何建议。

2 个答案:

答案 0 :(得分:0)

根据许多因素,您可以尝试使用updatepannel选项:

ChildrenAsTriggers="true"

如果你现在需要推出一些东西,它可以作为临时解决方法。

答案 1 :(得分:0)

根据您的代码,UpdatePanel使用默认值,因此ChildrenAsTriggers为true且UpdateMode为Always,因此您应该每次都获得完整的回发。

但是我没有看到你设置Gridview的DataSourceID所以除非你在代码中的某个地方这样做,否则它不会赢得Databind。但是您最初必须处于编辑模式才能找到您尝试注册的控件。因此,当您进入编辑模式时需要注册控件,尝试在gridview RowEditing事件中查找并注册控件