经过大量的搜索和测试,是时候征求意见了 更新面板中的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也是一个选项,但是再次失败了更新面板的目的。
欢迎任何建议。
答案 0 :(得分:0)
根据许多因素,您可以尝试使用updatepannel选项:
ChildrenAsTriggers="true"
如果你现在需要推出一些东西,它可以作为临时解决方法。
答案 1 :(得分:0)
根据您的代码,UpdatePanel
使用默认值,因此ChildrenAsTriggers
为true且UpdateMode
为Always,因此您应该每次都获得完整的回发。
但是我没有看到你设置Gridview的DataSourceID所以除非你在代码中的某个地方这样做,否则它不会赢得Databind。但是您最初必须处于编辑模式才能找到您尝试注册的控件。因此,当您进入编辑模式时需要注册控件,尝试在gridview RowEditing事件中查找并注册控件