2013-10-18 79 views
4

我有一个包含gridview的常规面板的asp页面。 gridview有一些链接按钮用于生成pdf。GridView链接按钮不会导致外部UpdatePanel刷新

我也有一个UpdatePanel在常规面板内和下面的gridview包含一个标签。

当用户点击GridView中的'generate'链接按钮时,我希望标签说'报告生成'或类似的东西。

我一直无法得到这个工作。我可以整天向标签投入价值而没有任何东西。

下面是面板代码:

<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(); 

    } 

谢谢!

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

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

我是否需要使用UniqueID或者其他问题?

+0

加我加 – Kiarash

回答

4

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

+1

好一点的答案下评论。我实际上是在我的一个按钮测试中做了这个,但是在做了其他一些更改之后忘了重新放入。谢谢!另外,请参阅上面的编辑,了解我目前收到的错误... –

+0

那么它是否最终解决了您的问题? – Kiarash

+0

嗯,LinkBut​​tonGenerateRpt是你的按钮名称,但点是你的按钮将被创建多次(每行一次),因此它每次都会有不同的动态名称,所以只需从updatepanel中删除触发器并按照我提到的使用UpdatePanel1更新面板。更新(); – Kiarash

3

你不能设置一个按钮,是与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方法找出控件。然后在linkbutton的OnClick事件处理程序中调用UpdatePanel.Update()以使其更新。

GridView标记(仅下面显示的Linkbutton)。为您的链接按钮定义一个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事件。在这里,你注册了LinkBut​​ton作为asyncpostback触发

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(); 

     } 
+0

谢谢@FlopScientist ...我已经试过这种方法,不幸的是这个页面的ScriptManager在Site.Master页面中,所以我没有得到它的引用。如果它不是一件事,那是另一回事! –

+0

我发现这个代码解决了我的ScriptManager问题: ScriptManager scriptManager = ScriptManager.GetCurrent(this.Page); 但是,现在它没有在GridView上调用RowCommand,因为在完成RowCreated过程后,由于无效索引,GridView上的其他按钮和我的DataBind失败。 –

相关问题