我使用以下代码打印HTML DIV内容&它运行正常,但是当我在Aspx页面中使用Ajax控件时它会给我一个错误信息,即:
"扩展程序控件' CalendarExtender2'不是注册的扩展程序 控制。扩展程序控件必须使用注册 在调用RegisterScriptDescriptors()之前注册RegisterExtenderControl()。 参数名称:extenderControl"
这是我的C#代码
protected void BtnPrint_Click(object sender, EventArgs e)
{
StringWriter stringWrite = new StringWriter();
System.Web.UI.HtmlTextWriter htmlWrite = new System.Web.UI.HtmlTextWriter(stringWrite);
Page pg = new Page();
pg.EnableEventValidation = false;
HtmlForm frm = new HtmlForm();
pg.EnableEventValidation = false;
pg.Controls.Add(frm);
frm.Attributes.Add("runat", "server");
frm.Controls.Add(divContent);
pg.DesignerInitialize();
pg.RenderControl(htmlWrite);
string strHTML = stringWrite.ToString();
HttpContext.Current.Response.Clear();
HttpContext.Current.Response.Write(strHTML);
HttpContext.Current.Response.Write("<script>window.print();</script>");
HttpContext.Current.Response.End();
}
这是我的Aspx代码
<%@ Page Title="" Language="C#" MasterPageFile="~/Masters/TSAMaster.master" AutoEventWireup="true"
EnableEventValidation="false" Theme="skinFiles" CodeFile="AdminHome.aspx.cs"
Inherits="Masters_Default" %>
<%@ Register Assembly="AjaxControlToolkit" Namespace="AjaxControlToolkit" TagPrefix="ajaxToolkit" %>
<asp:Content ID="Content1" ContentPlaceHolderID="head" runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" runat="Server">
<script type="text/javascript">
function ValidateDate() {
isValidDate = ValidateDate();
if (!isValidDate) {
return false;
}
else {
return true;
}
}
function ValidateDate() {
var Fdate = document.getElementById('ctl00_ContentPlaceHolder1_txtFDate').value;
var Tdate = document.getElementById('ctl00_ContentPlaceHolder1_txtTDate').value;
var todaysDate = formatDate(new Date(), 'dd/MM/yyyy');
var isValidDate = true;
var flag;
if (trim(Fdate) != 0 || trim(Tdate) != 0) {
if (!isDate(Fdate, 'dd/MM/yyyy')) {
alert("Please select valid From Date enter into (dd/MM/yyyy) format");
document.getElementById('ctl00_ContentPlaceHolder1_txtFDate').focus();
return false;
}
if (!isDate(Tdate, 'dd/MM/yyyy')) {
alert("Please select valid To Date enter into (dd/MM/yyyy) format ");
document.getElementById('ctl00_ContentPlaceHolder1_txtFDate').focus();
return false;
}
if (((compareDates(Fdate, 'dd/MM/yyyy', Tdate, 'dd/MM/yyyy')) == 1)) {
alert("To date cannot be less than From Date ");
return false;
}
return true;
}
}
function trim(str) {
return str.replace(/^[\s]+/, '').replace(/[\s]+$/, '').replace(/[\s]{2,}/, ' ');
}
</script>
<ajaxToolkit:ToolkitScriptManager runat="Server" EnableScriptGlobalization="true"
EnableScriptLocalization="true" ID="ScriptManager1" />
<center>
<div class="divContainPage" id="divContent" runat="server">
<table id="tblHead" runat="server">
<tr>
<td>
<asp:Label ID="Label3" runat="server" Text="DueDate Report" Font-Bold="True" Font-Names="Verdana"
Font-Size="Large" ForeColor="#C80000"></asp:Label>
<br />
<br />
<table id="tbl1" runat="server" style="width: 823px">
<tr>
<td>
Select Payment Mode:
</td>
<td>
<asp:DropDownList ID="ddlPayMode" runat="server" CssClass="DropDown" Width="85px">
<asp:ListItem>--Select--</asp:ListItem>
<asp:ListItem>Cash</asp:ListItem>
<asp:ListItem>Cheque</asp:ListItem>
</asp:DropDownList>
</td>
<td>
From Date:
</td>
<td>
<asp:TextBox ID="txtFDate" runat="server" Width="110px"></asp:TextBox>
<asp:ImageButton ID="imgCalendar" runat="server" ImageUrl="~/Images/calendar.png"
TabIndex="1" />
<ajaxToolkit:CalendarExtender ID="CalendarExtender2" runat="server" TargetControlID="txtFDate"
Format="dd/MM/yyyy" PopupPosition="BottomRight" PopupButtonID="imgCalendar" />
</td>
<td>
To Date:
</td>
<td>
<asp:TextBox ID="txtTDate" runat="server" Width="110px"></asp:TextBox>
<asp:ImageButton ID="imgCalendar1" runat="server" ImageUrl="~/Images/calendar.png"
TabIndex="2" />
<ajaxToolkit:CalendarExtender ID="CalendarExtender3" runat="server" TargetControlID="txtTDate"
Format="dd/MM/yyyy" PopupPosition="BottomRight" PopupButtonID="imgCalendar1" />
</td>
<td>
<asp:Button ID="btnGo" runat="server" Text="Go" OnClick="btnGo_Click" OnClientClick="return ValidateDate();" />
</td>
<td>
<asp:Button ID="btnReset" runat="server" Text="Reset" OnClick="btnReset_Click" Width="47px" />
</td>
</tr>
</table>
<table style="width: 600px" runat="server" id="tblone">
<tr>
<td>
<asp:GridView ID="grdStudentInfo" runat="server" SkinID="Professional" DataKeyNames="StudentID"
Width="800px" AllowSorting="True" AutoGenerateColumns="False" BackColor="#DEBA84"
BorderColor="#DEBA84" BorderStyle="None" BorderWidth="1px" CellPadding="3" CellSpacing="2"
OnSorting="grdStudentInfo_sorting" AllowPaging="True" OnPageIndexChanging="grdStudentInfo_PageIndexChanging"
OnRowCommand="grdStudent_RowCommand">
<RowStyle BackColor="#FFF7E7" ForeColor="#8C4510" />
<Columns>
<asp:BoundField HeaderText="Name" DataField="FirstandLastName" SortExpression="FirstandLastName">
<ItemStyle HorizontalAlign="left" Width="100px" />
<HeaderStyle HorizontalAlign="left" Width="100px" />
</asp:BoundField>
<asp:BoundField HeaderText="Amount Due" DataField="FirstInstallmentFee" SortExpression="FirstInstallmentFee">
<ItemStyle HorizontalAlign="left" Width="100px" />
<HeaderStyle HorizontalAlign="left" Width="100px" />
</asp:BoundField>
<asp:BoundField HeaderText="Payment Mode" DataField="FirstInsMode" SortExpression="FirstInsMode">
<ItemStyle HorizontalAlign="left" Width="100px" />
<HeaderStyle HorizontalAlign="left" Width="100px" />
</asp:BoundField>
<asp:BoundField HeaderText="Bank Name" DataField="FirstBankName" SortExpression="FirstBankName">
<ItemStyle HorizontalAlign="left" Width="200px" />
<HeaderStyle HorizontalAlign="left" Width="200px" />
</asp:BoundField>
<asp:BoundField HeaderText="Cheque Number" DataField="FirstChequeNumber" SortExpression="FirstChequeNumber">
<ItemStyle HorizontalAlign="left" Width="200px" />
<HeaderStyle HorizontalAlign="left" Width="200px" />
</asp:BoundField>
<asp:BoundField HeaderText="Due Date" DataField="FirstInstallmentDate" SortExpression="FirstInstallmentDate">
<ItemStyle HorizontalAlign="left" Width="200px" />
<HeaderStyle HorizontalAlign="left" Width="200px" />
</asp:BoundField>
<asp:TemplateField HeaderText="Edit">
<ItemTemplate>
<asp:LinkButton ID="lnkEdit" runat="server" CommandName="editStudent" Text="Edit"
CommandArgument='<%#Eval("StudentID")%>'></asp:LinkButton>
</ItemTemplate>
<ItemStyle HorizontalAlign="Left" Width="200px" />
<HeaderStyle HorizontalAlign="Left" Width="200px" />
</asp:TemplateField>
</Columns>
<FooterStyle BackColor="#F7DFB5" ForeColor="#8C4510" />
<PagerStyle ForeColor="#8C4510" HorizontalAlign="Center" />
<SelectedRowStyle BackColor="#738A9C" Font-Bold="True" ForeColor="White" />
<HeaderStyle BackColor="#A55129" Font-Bold="True" ForeColor="White" />
</asp:GridView>
</td>
</tr>
</table>
<table id="tbl3" runat="server">
<tr style="height: 30px;">
<td>
<asp:Button ID="btnExport2PDF" runat="server" Text="Export To PDF" OnClick="btnExport2PDF_Click" />
</td>
<td>
<asp:Button ID="btnExport2XLS" runat="server" Text="Export To XLS" OnClick="btnExport2XLS_Click" />
<asp:HiddenField ID="hidSort" runat="server" Value="1" />
</td>
</tr>
</table>
</td>
</tr>
</table>
</div>
</center>
如果我使用frm.Controls.Add(tblOne)
代替frm.Controls.Add(divContent)
,那么它可以正常工作,因为tblone
没有Ajax控件。但divContent
同时具有表和Ajax控件,并抛出上述异常。我尝试了很多选项,例如覆盖OnInit
和OnPreRender
,但对我来说并不起作用。
答案 0 :(得分:0)
这可能是由于您的代码中放置了ToolkitScriptManager。看看这是否可以解决您的问题:
Error: Extender controls may not be registered before PreRender
答案 1 :(得分:0)
最后我通过使用JavaScript代码解决了这个问题。它对我来说效果更好,我要感谢所有给予他们宝贵时间的人。反馈。 代码在这里:
<script>
function Panel1() {
var panel = document.getElementById("<%=printablediv.ClientID %>");
var printWindow = window.open('', '', 'height=400,width=800');
printWindow.document.write('<html><head><title>newTable</title>');
printWindow.document.write('</head><body >');
printWindow.document.write(panel.innerHTML);
printWindow.document.write('</body></html>');
printWindow.document.close();
setTimeout(function() {
printWindow.print();
printWindow.close();
}, 1000);
return false;
}
</script>