Error on button click after implementing PDF Generation on radgrid
My requirement is to generate PDF while clicking on image button in the grid.In the same page I have one search button(btnSearch). I have implemented OnNeedDataSource event.While clicking on search button I want to rebind the radgrid but I am getting this errorerror “ErrorDetails : System.ArgumentException: Cannot unregister UpdatePanel with ID 'upnlPdf' since it was not registered with the ScriptManager. This might occur if the UpdatePanel was removed from the control tree and later added again, which is not supported. Parameter name: updatePanel at System.Web.UI.PageRequestManager.UnregisterUpdatePanel(UpdatePanel updatePanel) at System.Web.UI.ScriptManager.System.Web.UI.IScriptManagerInternal.UnregisterUpdatePanel(UpdatePanel updatePanel) at System.Web.UI.UpdatePanel.OnUnload(EventArgs e) at System.Web.UI.Control.UnloadRecursive(Boolean dispose) at System.Web.UI.Control.UnloadRecursive(Boolean dispose) at System.Web.UI.Control.UnloadRecursive(Boolean dispose) at System.Web.UI.Control.UnloadRecursive(Boolean dispose) at System.Web.UI.Control.RemovedControl(Control control) at System.Web.UI.ControlCollection.RemoveAt(Int32 index) at System.Web.UI.ControlCollection.Clear() at System.Web.UI.WebControls.CompositeDataBoundControl.PerformDataBinding(IEnumerable data) at System.Web.UI.WebControls.DataBoundControl.OnDataSourceViewSelectCallback(IEnumerable data) at System.Web.UI.DataSourceView.Select(DataSourceSelectArguments arguments, DataSourceViewSelectCallback callback) at System.Web.UI.WebControls.DataBoundControl.PerformSelect() at Telerik.Web.UI.GridTableView.PerformSelect() at System.Web.UI.WebControls.BaseDataBoundControl.DataBind() at Telerik.Web.UI.GridTableView.DataBind() at Telerik.Web.UI.RadGrid.DataBind() at Telerik.Web.UI.RadGrid.AutoDataBind(GridRebindReason rebindReason) at Telerik.Web.UI.RadGrid.Rebind() at btnSearch_Click(Object sender, EventArgs e)”.
In aspx Page
<%@ 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>
In code behind
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" + strOrde开发者_StackOverflowrId;
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;
}
}
I don't know why, but somehow the UpdatePanel is unregistered from the ScriptManger twice (it happens in RadGrid.Rebind() method too; the situation I was stuck in), and the second time it's unregistered from ScriptManger you get the "Cannot unregister UpdatePanel ..." error. The workaround is to register the UpdatePanel with the ScriptManger somewhere between the two unregister events, using reflection, like this:
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 });
}
you should add the UpdatePanel_Unload to the OnUnload event of the UpdatePanel:
<asp:UpdatePanel ID="UpdatePanel1" runat="server" OnUnload="UpdatePanel_Unload">
This solution resolved my problem, I hope it would be effective for you too.
You can find the complete details of the problem here.
Regards, Ali
精彩评论