2011-07-28 41 views
0

我的要求是在單擊網格中的圖像按鈕時生成PDF。在同一頁中,我有一個搜索按鈕(btnSearch)。我已經實現OnNeedDataSource event.While點擊搜索按鈕,我想重新綁定radgrid控件,但我得到這個errorerror「ErrorDetails信息:System.ArgumentException:不能與ID‘upnlPdf’,因爲它並沒有使用ScriptManager註冊註銷的UpdatePanel。如果從控制樹中刪除UpdatePanel並在稍後再次添加UpdatePanel,則可能會發生這種情況,這是不受支持的。參數名稱:System.Web.UI.UpdatePanel.OnUnload上的System.Web.UI.ScriptManager.System.Web.UI.IScriptManagerInternal.UnregisterUpdatePanel(UpdatePanel updatePanel)上的System.Web.UI.PageRequestManager.UnregisterUpdatePanel(UpdatePanel updatePanel)上的updatePanel (EventArgs e)在System.Web.UI.Control.UnloadRecursive(布爾部署)在System.Web.UI.Control.UnloadRecursive(布爾部署)在System.Web.UI.Control.UnloadRecursive(布爾部署)在System.Web在System.Web.UI.Control.RemovedControl(控件控件)System.Web.UI.ControlCollection.RemoveAt(Int32索引)System.Web.UI.ControlCollection.Clear()上的.UI.Control.UnloadRecursive(布爾dispose)在System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable的數據)在System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable的數據)在System.Web.UI.DataSourceView.Select(DataSourceSelectArguments參數,DataSourceViewSelectCallback回調)在System.Web.UI.WebControls.Dat在Telerik.Web.UI的Telerik.Web.UI.GridTableView.DataBind()處的System.Web.UI.WebControls.BaseDataBoundControl.DataBind()處的Telerik.Web.UI.GridTableView.PerformSelect()處的aBoundControl.PerformSelect()。在Telerik.Web.UI.RadGrid.AutoDataBind(GridRebindReason rebindReason)上的RadGrid.DataBind()在Telerik.Web.UI.RadGrid.Rebind()上的btnSearch_Click(Object sender,EventArgs e)「。在radgrid上實現PDF生成後按鈕單擊時出錯

在ASPX頁面

<%@ Page Language="C#" MasterPageFile="~/ATMaster.Master" AutoEventWireup="true"> 
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" runat="server"> 
    <asp:UpdatePanel runat="server" ID="upnlSecurityDoc" UpdateMode="Conditional"> 
     <ContentTemplate> 
<telerik:RadGrid ID="RadGrid1" runat="server" Width="1050px" TabIndex="5" Height="350px" 
             AutoGenerateColumns="False" ForeColor="#333333" PageSize="10" AllowFilteringByColumn="false" 
             Skin="Outlook" AllowPaging="true" OnNeedDataSource=" RadGrid1_NeedDataSource" 
             BorderWidth="1px" BorderColor="#cccccc" OnItemCommand=" RadGrid1_ItemCommand" 
             > 
             <HeaderContextMenu EnableAutoScroll="True"> 
             </HeaderContextMenu> 
             <GroupingSettings CaseSensitive="false" /> 
             <MasterTableView PagerStyle-AlwaysVisible="true"> 
              <CommandItemSettings ExportToPdfText="Export to Pdf" /> 
              <Columns> 
               <telerik:GridTemplateColumn HeaderText="SlNo" AllowFiltering="false"> 
                <HeaderStyle HorizontalAlign="Left" Font-Bold="true" Width="50px" /> 
                <ItemStyle HorizontalAlign="Left" Width="50px"></ItemStyle> 
                <ItemTemplate> 
                 <%# this.gvPendingOrder.CurrentPageIndex * this.gvPendingOrder.PageSize + Container.ItemIndex + 1%> 
                </ItemTemplate> 
               </telerik:GridTemplateColumn> 

<telerik:GridTemplateColumn HeaderText="PDF"> 
                <HeaderStyle Width="50px" /> 
                <ItemStyle Width="50px" /> 
                <ItemTemplate> 
                 <asp:UpdatePanel runat="server" ID="upnlPdf"> 
                  <ContentTemplate> 
                   <asp:ImageButton runat="server" ID="imgbtnPdf" AlternateText="Security Document Print" 
                    CommandArgument='<%# Eval("OrderId") %>' ImageUrl="../Images/pdf_icon.gif" ImageAlign="Middle" 
                    CommandName="Generate" ToolTip='<%# "Document" + Eval("OrderNo") + "." %>' /> 
                  </ContentTemplate> 
                  <Triggers> 
                   <asp:PostBackTrigger ControlID="imgbtnPdf" />               </Triggers> 
                 </asp:UpdatePanel> 
                </ItemTemplate> 
               </telerik:GridTemplateColumn> 
              </Columns> 
             </MasterTableView> 
             <ClientSettings EnableRowHoverStyle="true"> 
              <Scrolling AllowScroll="True" UseStaticHeaders="True" SaveScrollPosition="True"> 
              </Scrolling> 
             </ClientSettings> 
            </telerik:RadGrid> 
</ContentTemplate> 
    </asp:UpdatePanel> 
</asp:Content> 

在後面的代碼

protected void RadGrid1_ItemCommand(object source, GridCommandEventArgs e) 
     { 
      try 
      { 
       if (e.CommandName == "Generate") 
       { 
        string strOrderId = string.Empty; 
        strOrderId = e.CommandArgument.ToString(); 
        LocalReport localReport = new LocalReport(); 
       localReport.ReportPath = Server.MapPath("~/Reports/report1.rdlc"); 
       localReport.EnableHyperlinks = true; 
       localReport.EnableExternalImages = true; 

       DataSet dataset1 = new DataSet(); 
       DataTable datatable1 =GetDetails(strOrderId); 
       datatable1.TableName = "Document"; 
       dataset1.Tables.Add(datatable1.Copy()); 

       ReportParameter[] @params = new ReportParameter[4]; 
       localReport.SetParameters(@params); 

       //A method that returns a collection for our report Note: A report can have multiple data sources 
       localReport.DataSources.Add(new ReportDataSource("dataset", dataset1.Tables[0])); 
       string reportType = "pdf"; 
       string mimeType = string.Empty; 
       string encoding = string.Empty; 
       string fileNameExtension = string.Empty; 
       string deviceInfo = "<DeviceInfo>" + " <OutputFormat>pdf</OutputFormat>" + "</DeviceInfo>"; 
       Warning[] warnings = null; 
       string[] streams = null; 
       byte[] renderedBytes = null; 

       //Render the report 
       renderedBytes = localReport.Render(reportType, deviceInfo, out mimeType, out encoding, out fileNameExtension, out streams, out warnings); 

       //Clear the response stream and write the bytes to the outputstream 
       //Set content-disposition to "attachment" so that user is prompted to take an action on the file (open or save) 
       Response.Clear(); 
       Response.ContentType = mimeType; 
       strOrderId = "Doc" + strOrderId; 
       Response.AddHeader("content-disposition", ("attachment; filename=" + strOrderId + ".pdf")); 
       Response.BinaryWrite(renderedBytes); 
       Response.End();    } 
      } 
      catch (Exception ex) 
      { 
       lblMessage.Text = objUtl.GetErrorMessage(ex, this); 
       lblMessage.Visible = true; 
      } 
     } 

回答

0

我不知道爲什麼,但不知何故,在UpdatePanel從ScriptManger未註冊的兩倍(這發生在RadGrid.Rebind()方法也;我被卡住的情況),第二次從ScriptManger註銷時,您將看到「無法取消註冊UpdatePanel ...」錯誤。 解決方法是用ScriptManger某處兩個註銷事件之間註冊的UpdatePanel,使用反射,這樣的:

protected void UpdatePanel_Unload(object sender, EventArgs e) { MethodInfo methodInfo = typeof(ScriptManager).GetMethods(BindingFlags.NonPublic | BindingFlags.Instance) .Where(i => i.Name.Equals("System.Web.UI.IScriptManagerInternal.RegisterUpdatePanel")).First(); methodInfo.Invoke(ScriptManager.GetCurrent(Page), new object[] { sender as UpdatePanel }); }

你應該UpdatePanel_Unload添加到UpdatePanel中的onunload事件:

<asp:UpdatePanel ID="UpdatePanel1" runat="server" OnUnload="UpdatePanel_Unload"> 

這個解決方案解決了我的問題,我希望它對你也有效。

您可以找到問題here的完整詳細信息。

Regards, Ali

相關問題