【问题标题】:GridView linkbutton not causing external UpdatePanel to refreshGridView 链接按钮不会导致外部 UpdatePanel 刷新
【发布时间】:2013-10-18 05:07:03
【问题描述】:

我有一个带有常规面板的asp 页面,其中包含一个gridview。 gridview 有一些用于生成 pdf 的链接按钮。

我在常规面板内和包含标签的网格视图下方也有一个 UpdatePanel。

当用户单击网格视图内的“生成”链接按钮时,我希望标签显示“生成报告”或类似的内容。

我根本无法让它工作。我可以整天把值扔到标签里,什么也没有。

这是面板的代码:

<asp:Panel ID="ReportsPanel" runat="server" Height="611px">
    <h2>
        Reports
    </h2>
    <asp:Label ID="ReportsNotification" runat="server"></asp:Label>
    <br />
    <asp:Label ID="Label1" runat="server" Text="Pharmacy: "></asp:Label>
    <asp:DropDownList ID="PharmaciesDropDownList" runat="server" AutoPostBack="true"
        OnSelectedIndexChanged="PharmaciesDropDownList_SelectedIndexChanged">
    </asp:DropDownList>
    <br />
    <br />
    <asp:GridView ID="ListReportsGridView" runat="server" AllowPaging="true" AllowSorting="true"
        GridLines="None" PageSize="10" CssClass="GridView" AutoGenerateColumns="false"
        EmptyDataText="No rows for selection." OnRowCommand="ListReportsGridView_RowCommand"
        OnPageIndexChanging="ListReportsGridView_PageIndexChanging"
        EnablePersistedSelection="True"
        DataKeyNames="FinDataID">
        <AlternatingRowStyle CssClass="GridViewAltRow" />
        <HeaderStyle CssClass="GridViewHeader" />
        <RowStyle CssClass="GridViewItem" />
        <PagerStyle CssClass="GridViewPager" />
        <Columns>
            <asp:BoundField DataField="ID" HeaderText="ID" ControlStyle-CssClass="Hidden" ItemStyle-CssClass="Hidden"
                HeaderStyle-CssClass="Hidden" FooterStyle-CssClass="Hidden" />
            <asp:BoundField DataField="FinDataID" HeaderText="FinDataID" ControlStyle-CssClass="Hidden" ItemStyle-CssClass="Hidden"
                HeaderStyle-CssClass="Hidden" FooterStyle-CssClass="Hidden" />
            <asp:BoundField DataField="PeriodStart" HeaderText="Period Start" DataFormatString="{0:dd/MM/yyyy}" />
            <asp:BoundField DataField="PeriodEnd" HeaderText="Period End" DataFormatString="{0:dd/MM/yyyy}" />
            <asp:TemplateField HeaderText="Reports Available for Download"><ItemTemplate><asp:LinkButton ID="LinkButtonViewRpt" Text='<%#Eval("FileName") %>' CommandName="ViewRpt" CommandArgument="<%# Container.DataItemIndex %>" runat="server"></asp:LinkButton></ItemTemplate></asp:TemplateField>    
            <asp:TemplateField Visible="false"><ItemTemplate><asp:LinkButton ID="LinkButtonGenerateRpt" Text='Generate' CommandName="GenerateRpt" CommandArgument="<%# Container.DataItemIndex %>" runat="server"></asp:LinkButton></ItemTemplate></asp:TemplateField>    
            <asp:TemplateField Visible="false"><ItemTemplate><asp:LinkButton ID="LinkButtonUploadRpt" Text='Upload' CommandName="UploadRpt" CommandArgument="<%# Container.DataItemIndex %>" runat="server"></asp:LinkButton></ItemTemplate></asp:TemplateField>    
        </Columns>
    </asp:GridView>
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" UpdateMode="Conditional">
        <Triggers>
            <asp:AsyncPostBackTrigger ControlID="LinkButtonGenerateRpt" EventName="Click" />
        </Triggers>
        <ContentTemplate>
            <asp:Label ID="lblMessage" runat="server" Text=""></asp:Label>
        </ContentTemplate>
    </asp:UpdatePanel>
    <br />
</asp:Panel>

我已经尝试在 UpdatePanel 中使用 UpdatePanel 之外的按钮,但这些想法都没有奏效。这当然是可能的!

我想知道的一件事是,当“生成”按钮触发并创建它调用 Response.End 的 pdf 时。我知道这将结束线程并且不会重新加载页面。但我希望我可以在 发生这种情况之前刷新 UpdatePanel……据我所知,这就是 UpdatePanel 的用途,部分页面更新。

下面是gridview的代码:

protected void ListReportsGridView_RowCommand(object sender, GridViewCommandEventArgs e)
{
    intIndex = Convert.ToInt32(e.CommandArgument);
    if (e.CommandName == "GenerateRpt")
    {//render pdf

        //populate empty report object with row information
        objFileData = new FileData();
        objFileData.PharmacyID = Convert.ToInt32(PharmaciesDropDownList.SelectedValue);
        objFileData.FinDataID = Convert.ToInt32(ListReportsGridView.Rows[intIndex].Cells[1].Text);
        objFileData.CreateDate = Convert.ToDateTime(DateTime.Now);
        objFileData.CreatedByID = Convert.ToInt32(Session["UserID"]);
        objFileData.PeriodStart = Convert.ToDateTime(ListReportsGridView.Rows[intIndex].Cells[2].Text);

        lblMessage.Text = "Report generating...";
        //btnGenerate_Click(sender, e);
        RenderPdf();

    }

提前致谢!

编辑:我也收到此错误...

在 UpdatePanel“UpdatePanel1”中找不到触发器 ID 为“LinkBut​​tonGenerateRpt”的控件。

我是否需要使用 UniqueID,否则范围是否会成为问题?

【问题讨论】:

  • 在我添加的答案下添加了评论

标签: c# asp.net gridview updatepanel


【解决方案1】:

您的更新面板UpdateMode 是有条件的,您必须自己触发更新 所以当你需要更新它时,你必须说UpdatePanel1.Update();

【讨论】:

  • 好点。我实际上是在我的一个按钮测试中这样做的,但在进行了一些其他更改后忘记将其放回原处。谢谢!另外,请参阅上面的编辑以了解我当前收到的错误...
  • 那么它最后解决了你的问题吗?
  • 嗯 LinkBut​​tonGenerateRpt 是您的按钮名称,但关键是您的按钮将被创建多次(每行一次),因此每次都会有不同的动态名称,所以只需从更新面板中删除触发器并更新您的正如我提到的使用 UpdatePanel1.Update(); 的面板
  • 再次感谢!我删除了触发器,因为我现在不需要两者。没有错误,我的代码正在执行,但我仍然没有在 UpdatePanel 中看到标签文本...不确定现在发生了什么。
【解决方案2】:

您不能将位于不同命名容器中的按钮设置为 updatepanel 作为触发器。这就是您收到错误的原因:A control with ID 'LinkButtonGenerateRpt' could not be found for the trigger in UpdatePanel 'UpdatePanel1

如果你真的想让Linkbutton成为触发器,你需要使用ScriptManager.RegisterAsyncPostBackControl方法,甚至不支持以编程方式添加AsyncPostBackTrigger控件。

您可以处理 GridView 的 OnRowCreated 事件并为每个 LinkBut​​ton 调用 ScriptManager.RegisterAsyncPostBackControl。通过 findcontrol 方法找出控件。然后在链接按钮的OnClick 事件处理程序中调用UpdatePanel.Update() 以使其更新。

GridView 标记(仅如下所示的链接按钮)。为链接按钮定义一个OnClick 事件。

<asp:TemplateField Visible="false">
<ItemTemplate>
<asp:LinkButton ID="LinkButtonGenerateRpt" Text='Generate' 
     CommandName="GenerateRpt" 
     CommandArgument="<%# Container.DataItemIndex %>" 
     OnClick="LinkButtonGenerateRpt_Click"runat="server">
    </asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>

// Grid View 的 RowCreated 事件。在这里您将链接按钮注册为异步回发触发器

protected void ListReportsGridView_RowCreated(object sender, GridViewRowEventArgs e)
 {
    Control lnkBtnControl = e.Row.Cells[5].FindControl("LinkButtonGenerateRpt");
       if (lnkBtnControl!= null)
         {
            ScriptManager1.RegisterAsyncPostBackControl(lnkBtnControl );
         }    
 }

并更新 LinkBut​​ton 上的 UpdatePanel 点击为:

protected void LinkButtonGenerateRpt_Click(object sender, EventArgs e)
        {

            UpdatePanel1.Update();

        }

【讨论】:

  • 感谢@FlopScientist...不幸的是,我已经尝试过这种方法,此页面的 ScriptManager 位于 Site.Master 页面中,因此我没有得到它的参考。如果不是一回事,那就是另一回事了!
  • 我找到了解决我的 ScriptManager 问题的代码: ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page);但是,现在当我单击其他按钮时,它不会在 gridview 上调用 RowCommand,并且我在 gridview 上的 DataBind 在完成 RowCreated 过程后由于索引无效而失败...
猜你喜欢
  • 2013-12-26
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 2012-10-13
  • 2015-01-14
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多