【问题标题】:Refresh an updatepanel on buttonclick from code-behind从代码隐藏中单击按钮刷新更新面板
【发布时间】:2018-10-26 20:32:57
【问题描述】:

我正在使用一个使用数据源和数据绑定的 Gridview。当我重新加载页面时,gridview 会更新,但我希望它在 buttonclick 上,但它对我不起作用。

更新面板内的gridview:

<asp:ScriptManager ID="ScriptManager1" runat="server">
    </asp:ScriptManager>
    <asp:UpdatePanel ID="upWall" runat="server" ChildrenAsTriggers="true" UpdateMode="conditional">
        <ContentTemplate>
            <asp:GridView ID="gvWallPosts" runat="server" AutoGenerateColumns = "false" 
             CaptionAlign="NotSet" CellPadding="5">
            <Columns>
                <asp:TemplateField HeaderText="Avsändare">
                    <ItemTemplate>
                        <%# GetSender((int)Eval("WallSender"))%>
                        <br />
                    </ItemTemplate>
                </asp:TemplateField>
                <asp:TemplateField HeaderText="Inlägg">
                    <ItemTemplate>
                        <%# Eval("Post")%>
                        <br />
                    </ItemTemplate>
                </asp:TemplateField>
            </Columns>
            </asp:GridView>
        </ContentTemplate>
    </asp:UpdatePanel>
    <asp:TextBox ID="txtWall" runat="server" Height="105px" TextMode="MultiLine" Width="227px"></asp:TextBox>
    <br />
    <asp:Button ID="btnWall" runat="server" Text="Posta" onclick="btnWall_Click" />

代码隐藏:

protected void btnWall_Click(object sender, EventArgs e)
    {
        con.SendWallPost(con.GetId(Membership.GetUser().UserName), Convert.ToInt32(Request.QueryString["ID"]), txtWall.Text); //This method is sending the post
        upWall.Update();
    }

所以,我希望在 ButtonClick 上更新 updatepanel,我不想重新加载整个页面来查看结果

【问题讨论】:

  • 你如何重新加载你的页面?
  • 你确定点击处理程序被触发了吗?
  • 是的,它被触发了,因为当我重新加载页面时,面板会更新
  • 我仍然想知道您是否正在使用代码重新加载页面。
  • Abide Masaraure:不,我没有使用任何代码来重新加载页面。只需使用浏览器重新加载它。这就是为什么我想让这个更新面板工作:)

标签: c# asp.net updatepanel


【解决方案1】:

由于我没有看到按钮 btnWall,我认为它在 UpdatePanel 之外。 但如果您想允许UpdatePanel 之外的控件触发回发,则需要定义一个显式触发器。

因此你可以使用AsyncPostBackTrigger:

<asp:UpdatePanel ID="upWall" runat="server" ChildrenAsTriggers="true" UpdateMode="conditional">
     <ContentTemplate>
         ....
     </ContentTemplate>
     <Triggers>
        <asp:AsyncPostBackTrigger ControlID="btnWall" EventName="Click" />
     </Triggers>
 </asp:UpdatePanel>

【讨论】:

  • 你确定con.SendWallPost没有抛出异常吗?
  • 是的,那么应用程序应该会崩溃,因为我暂时没有执行任何 try/catch
  • @krillezzz:由于您处于异步回发中,您可能会将异常视为可能被隐藏或吞下的 javascript 错误。无论如何,使用调试器看看是否成功。
【解决方案2】:

默认情况下,部分页面更新在更新面板中启用,因为 ScriptManager 控件的 EnablePartialRendering 属性的默认值为 true。将按钮放在更新面板中就足以满足您的需要,因为按钮起作用作为面板内的异步回发控件。然后在更新后添加此行(gvWallospts.Databind())。让我知道它是如何进行的。

protected void btnWall_Click(object sender, EventArgs e)
{
    con.SendWallPost(con.GetId(Membership.GetUser().UserName), Convert.ToInt32(Request.QueryString["ID"]), txtWall.Text); //This method is sending the post
    //upWall.Update();
    gvWallPosts.DataBind();
}

尝试像这样设置标记

  <asp:ScriptManager ID="ScriptManager1" runat="server">
   </asp:ScriptManager>
      <asp:UpdatePanel ID="upWall" runat="server" ChildrenAsTriggers="true" UpdateMode="conditional">
    <ContentTemplate>
        <asp:GridView ID="gvWallPosts" runat="server" AutoGenerateColumns = "false" 
         CaptionAlign="NotSet" CellPadding="5">
        <Columns>
    <asp:Templatefield>
   <asp:Button ID="btnWall" runat="server" Text="Posta" command="Edit" />
     </asp:TemplateField>
            <asp:TemplateField HeaderText="Avsändare">
                <ItemTemplate>
                    <%# GetSender((int)Eval("WallSender"))%>
                    <br />
                </ItemTemplate>

                <EditItemTemplate>

                      <asp:TextBox Text='<%# Bind("WallSender")%>' />
                </EditItemTemplate>

            </asp:TemplateField>
            <asp:TemplateField HeaderText="Inlägg">
                <ItemTemplate>
                    <%# Eval("Post")%>
                    <br />
                </ItemTemplate>
                   <EditItemTemplate>

                     <asp:TextBox  Text='<%# Bind("Post")%>'/>
                </EditItemTemplate>
            </asp:TemplateField>
        </Columns>
        </asp:GridView>
    </ContentTemplate>
</asp:UpdatePanel>

在您的网格行更新事件中

  protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{


    con.SendWallPost(con.GetId(Membership.GetUser().UserName),    Convert.ToInt32(Request.QueryString["ID"]), txtWall.Text); 
     gvWallPosts.DataBind();


}

确保页面加载中的绑定代码也被此夹在中间

 If(!IsPostBack)
     {
                   }

【讨论】:

  • 当我使用 gvWallPosts.DataBind() 而不声明整个 gridview 消失。但是如果我再次使用 gvWallPosts.Datasource ,整个页面都会重新加载,而不仅仅是更新面板
  • 你在哪里绑定你的datagridveiw。是否在页面加载
  • 我将更新我的帖子,说明如何使用编辑项模板来消除您的痛苦。项目模板从来都不是用来编辑记录的。
  • Bind 将获取文本框的内容并将它们映射回底层数据源。
  • 我已经更新了答案。要消除该错误,请将绑定值分配为文本框值
【解决方案3】:

您应该按照 Tim Schmelter 的建议将按钮放在更新面板中,或者定义一个显式触发器以在按钮单击事件时更新更新面板。

【讨论】:

  • 我现在都试过了,但在我重新加载整个页面之前它不会更新。它可以与更新面板上的任何属性有关吗,例如 UpdateMode?​​span>
  • 确保您没有任何 javascript 错误。尝试检查浏览器的错误控制台(在 Firefox 中)。最可能的原因是 javascript 冲突。更新面板是使用 javascript(客户端)更新的,因此如果您在 javascript 中遇到任何错误,则会导致问题。此外,客户端验证(验证器控件)也可以阻止面板更新。
  • 我会进一步建议您使用提琴手 fiddler2.com/fiddler2 。它会让你看到实际发生的事情。您还应该检查它是否正在发出任何请求,如果它正在发出请求,它是否得到了正确的答复。
  • 我没有使用任何 JavaScript,除了 Visual Studio 中的自动生成的 .js 文件
  • 你检查过错误控制台吗?此外,您无需从后面的代码更新更新面板。它会自动更新。你可以安全地消除这些谎言。
猜你喜欢
  • 1970-01-01
  • 2014-08-29
  • 2012-03-19
  • 2014-08-12
  • 1970-01-01
  • 2012-05-01
  • 2018-06-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多