阿泰大哥帮我看看-发布到服务器的水晶报表打印为什么访问到不局域网里的共享打印机
- C# code
/// <summary> /// 打印机列表 /// </summary> /// <returns></returns> private ArrayList GetPrinter() { ArrayList array = new ArrayList(); foreach (string iprt in System.Drawing.Printing.PrinterSettings.InstalledPrinters) array.Add(iprt); return array; }打印部分
- C# code
ReportDocument doc = new ReportDocument(); doc.PrintOptions.PrinterName = ddl_printList.SelectedValue.ToString(); CrytalName = "../PrintManager/Connection.rpt"; doc.Load(Server.MapPath("" + CrytalName + "")); doc.SetDataSource(dsDataSet); doc.PrintToPrinter(1, false, 0, 0);打印机是装在局域网的共享打印机
服务器上添加了此台打印机
目前在本地和服务器用VS2008环境测试是可以打印的。但是发布之后用
就会提示
System.Drawing.Printing.InvalidPrinterException: 对访问打印机“\\192.168.16.99\HP LaserJet 3050 Series PCL 6”的设置无效。
请高手帮我看看,到底如何解决~~
最后贴下最后的打印代码(实现选择性打印的多张水晶报表)
- C# code
/// <summary>
/// 打印
/// </summary>
/// <param name="sender"> </param>
/// <param name="e"> </param>
protected void btnSurePrint_Click(object sender, EventArgs e)
{
string id = Request.QueryString["id"];//结论书id
string printId = string.Empty;
for (int i = 0; i < this.cblPrint.Items.Count; i++)
{
if (this.cblPrint.Items[i].Selected)
{
printId += this.cblPrint.Items[i].Value+",";
}
}
printId += printId.Substring(0, printId.LastIndexOf(','));//需要打印的id
#region 选择性打印
DB_Conclusion dsDataSet = new DB_Conclusion();
string con = ConfigurationManager.ConnectionStrings["dbconn"].ConnectionString;
using (SqlConnection objSqlConnection = new SqlConnection(con))
{
//结论书
string sql = "SELECT a.cId, a.cTotalNo, a.cTitle, a.cContent, a.cAddPeople, a.cDate, b.oName FROM Conclusion AS a INNER JOIN Office AS b ON a.cIdentificationUnit = b.oid and a.cid=" + id;
SqlDataAdapter sdaAdapter = new SqlDataAdapter(sql, objSqlConnection);
sdaAdapter.Fill(dsDataSet, "Conclusion");
sdaAdapter.Dispose();
//sdaAdapter.
//现场勘查表
string sql2 = "SELECT sId, sCid, sPeople, sDate, sPlace, sObject, sAcompany, sRemark, sIsregout FROM Scene where sCid=" + id;
SqlDataAdapter sdaAdapter2 = new SqlDataAdapter(sql2, objSqlConnection);
sdaAdapter2.Fill(dsDataSet, "Scene");
sdaAdapter2.Dispose();
//不予受理通知书
string sql7 = "SELECT Tem_Accept.content2, Tem_Accept.content1, Tem_Accept.content3, Tem_Accept.id,Conclusion.cTotalNo, Office.oName, Accept.aUnitId, "
+ "Accept.aGoods, Accept.aDate, Conclusion.cId, Conclusion.cIdentificationUnit FROM Office INNER JOIN Conclusion INNER JOIN Tem_Accept ON "
+ "Conclusion.cUnitId = Tem_Accept.unitid INNER JOIN Accept ON Conclusion.cId = Accept.aCid ON Office.oid = Conclusion.cIdentificationUnit "
+ "where Conclusion.Cid=" + id + " and Conclusion.cUnitId=" + user.Dept.Id;
SqlDataAdapter sdaAdapter7 = new SqlDataAdapter(sql7, objSqlConnection);
sdaAdapter7.Fill(dsDataSet, "Tem_Accept");
sdaAdapter7.Dispose();
//明细表1
string sql8 = "SELECT Conclusion.cDate, userinf.name, Office.oName, Conclusion.cAppNum, Money.mJdTotal "
+ "FROM Conclusion INNER JOIN "
+ " Office ON Conclusion.cIdentificationUnit = Office.oid INNER JOIN "
+ " userinf ON Conclusion.cAddPeople = userinf.id INNER JOIN "
+ " Money ON Conclusion.cId = Money.mcid and Conclusion .cid=" + id;
SqlDataAdapter sdaAdapter8 = new SqlDataAdapter(sql8, objSqlConnection);
sdaAdapter8.Fill(dsDataSet, "Detail1");
sdaAdapter8.Dispose();
//明细表2
string sql9 = "select * from Detail where dCId=" + id;
SqlDataAdapter sdaAdapter9 = new SqlDataAdapter(sql9, objSqlConnection);
sdaAdapter9.Fill(dsDataSet, "Detail2");
sdaAdapter9.Dispose();
}
string CrytalName = "";
//套打选项
string sql_unit="select sPrintWay from SystemPara where sUnitId='"+user.Dept.Id+"'";
string sPrintWay = generalMethodsManager.GetDataBySql(sql_unit).Rows[0]["sPrintWay"].ToString();
#region 遍历打印
ReportDocument doc = new ReportDocument();
doc.PrintOptions.PrinterName = ddl_printList.SelectedValue.ToString();
//遍历CheckBoxList
for (int i = 0; i < this.cblPrint.Items.Count; i++)
{
if (this.cblPrint.Items[i].Selected)
{
//printId += this.cblPrint.Items[i].Value + ",";
switch (this.cblPrint.Items[i].Value)
{
case "1": //结论书打印
{
if (sPrintWay == "0")
{
//string aa;
CrytalName = "../PrintManager/Connection.rpt";
doc.Load(Server.MapPath("" + CrytalName + ""));
doc.SetDataSource(dsDataSet);
doc.PrintToPrinter(1, false, 0, 0);
break;
}
else
{
CrytalName = "../PrintManager/Connection1.rpt";
doc.Load(Server.MapPath("" + CrytalName + ""));
doc.SetDataSource(dsDataSet);
doc.PrintToPrinter(1, false, 0, 0);
break;
}
}
case "2": //明细表
{
CrytalName = "../PrintManager/CollectParticularsList.rpt";
doc.Load(Server.MapPath("" + CrytalName + ""));
doc.SetDataSource(dsDataSet);
doc.PrintToPrinter(1, false, 0, 0);
break;
}
case "3": //测算底稿
{
CrytalName = "../PrintManager/TechnicalReportOfAppraisal.rpt";
doc.Load(Server.MapPath("" + CrytalName + ""));
doc.SetDataSource(dsDataSet);
doc.PrintToPrinter(1, false, 0, 0);
break;
}
case "4": //不予受理通知书
{
CrytalName = "../PrintManager/NoticeCenter.rpt";
doc.Load(Server.MapPath("" + CrytalName + ""));
doc.SetDataSource(dsDataSet);
doc.PrintToPrinter(1, false, 0, 0);
break;
}
case "5": //业务承办单
{
CrytalName = "../PrintManager/YxsPriceCertificationContractor.rpt";
doc.Load(Server.MapPath("" + CrytalName + ""));
doc.SetDataSource(dsDataSet);
doc.PrintToPrinter(1, false, 0, 0);
break;
}
case "6": //现场勘查记录
{
CrytalName = "../PrintManager/SiteInspectionRecordsCr.rpt";
doc.Load(Server.MapPath("" + CrytalName + ""));
doc.SetDataSource(dsDataSet);
doc.PrintToPrinter(1, false, 0, 0);
break;
}
case "7": //市场调查记录
{
CrytalName = "../PrintManager/MarketResearchRecordCr.rpt";
doc.Load(Server.MapPath("" + CrytalName + ""));
doc.SetDataSource(dsDataSet);
doc.PrintToPrinter(1, false, 0, 0);
break;
}
case "8": //文书送达回执
{
CrytalName = "../PrintManager/YxsPriceCertificationReceipt.rpt";
doc.Load(Server.MapPath("" + CrytalName + ""));
doc.SetDataSource(dsDataSet);
doc.PrintToPrinter(1, false, 0, 0);
break;
}
}
}
}
#endregion
#endregion
}
[解决办法]
doc.PrintOptions.PrinterName = ddl_printList.SelectedValue.ToString();
发布到服务器后,ASPX里是访问不到共享打印机的
只能得到实际安装到本机的打印机(虚拟打印机或者直接连在服务器上的打印机)
这里你可以强制指定一个打印机,如
doc.PrintOptions.PrinterName =@"\\IP\打印机名称";
并且目标打印机要有everyone可操作的权限。