2013-10-18 80 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失敗。 –

相關問題