PrintControl.cs
'=================================================
public class PrintControl : System.Windows.Forms.UserControl
{
private System.Windows.Forms.Button button1;
private System.Windows.Forms.Button button2;
private System.Windows.Forms.Button button3;
private System.Windows.Forms.Label label1;
private System.Drawing.Printing.PrintDocument printDocument1;
private System.Windows.Forms.PageSetupDialog pageSetupDialog1;
private System.Windows.Forms.PrintPreviewDialog printPreviewDialog1;
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
private XmlDocument doc = new XmlDocument();
public static int Pages = 1;
public PrintControl()
{
// 该调用是 Windows.Forms 窗体设计器所必需的。
InitializeComponent();
this.printDocument1.PrintPage += new PrintPageEventHandler(this.pd_PrintPage); // TODO: 在 InitializeComponent 调用后添加任何初始化 }

private void SettingPrinter(XmlNode ps)
{
//打印方向(纵/横)
this.printDocument1.DefaultPageSettings.Landscape = bool.Parse(ps["landscape"].InnerText);
//设置纸张类型
string papername = ps["paperkind"].InnerText;
bool fitpaper = false;
//获取打印机支持的所有类型
foreach(PaperSize size in this.printDocument1.PrinterSettings.PaperSizes)
{
if(papername == size.PaperName)//看该打印机是否有我们需要的纸张类型
{
this.printDocument1.DefaultPageSettings.PaperSize = size;
fitpaper = true;
}
}
if(!fitpaper)
{
//假如没有我们需要的标准类型,则使用自定义的尺寸
this.printDocument1.DefaultPageSettings.PaperSize = 
new PaperSize("Custom", int.Parse(ps["paperwidth"].InnerText), 
int.Parse(ps["paperheight"].InnerText));
}
} private void PrintControl_Load(object sender, System.EventArgs e)
{
try
{
//装载报表XML数据
this.label1.Text = "正在加载报表数据,请稍侯...";
doc.Load("http://localhost/report.xml");
this.label1.Text = "报表数据加载完毕!";
this.button1.Enabled = this.button2.Enabled = this.button3.Enabled = true;
//设置打印机
if(doc["root"]["pagesetting"] != null)
{
SettingPrinter(doc["root"]["pagesetting"]);
}
}
catch(Exception ex)
{
this.label1.Text = ex.Message;
}
} private void pd_PrintPage(object sender, PrintPageEventArgs ev) 
{
Graphics g = ev.Graphics;
bool HasMorePages = false;
PrintElement printElement = null;
            
foreach(XmlNode node in doc["root"]["reporttable"].ChildNodes)
{
printElement = Parser.CreateElement(node);//调用解析器生成相应的对象
try
{
HasMorePages = printElement.Draw(g);//是否需要分页
}
catch(Exception ex)
{
this.label1.Text = ex.Message;
}
} //在页底中间输出页码
Font font = new Font("黑体", 12.0f);
Brush brush = new SolidBrush(Color.Black);
g.DrawString("第 " + Pages.ToString() + " 页",
font,brush,ev.MarginBounds.Width / 2 + ev.MarginBounds.Left - 30, 
ev.PageBounds.Height - 60); if(HasMorePages)
{
Pages++;
}
ev.HasMorePages = HasMorePages;
}
//页面设置
private void button1_Click(object sender, System.EventArgs e)
{
try
{
if (pageSetupDialog1.ShowDialog() == DialogResult.OK) 
{
this.printDocument1.DefaultPageSettings = this.pageSetupDialog1.PageSettings;
}
}
catch(Exception ex)
{
this.label1.Text = ex.Message;
} }        //打印预览
private void button2_Click(object sender, System.EventArgs e)
{
try
{
this.printPreviewDialog1.ShowDialog();
}
catch(Exception ex)
{
this.label1.Text = ex.Message;
}
} //打印
private void button3_Click(object sender, System.EventArgs e)
{
try
{
this.printDocument1.Print();
}
catch(Exception ex)
{
this.label1.Text = ex.Message;
}
}
}

解决方案 »

  1.   

    相关错误报告:
    直接在IE中试试http://localhost/report.xml
    >能访问

    >路径正确!!
      OK!!调试成功了,但还是出现在Label(Msg)中错误变为:
      " 未将对象引用设置到对象实例?   "
    ----------但在控件中没未设置的引用对象!
      点击打印设置中进行设置点确定后Msg:
            "  0不是有效句柄?! "
       点击打印预览之后,看得到利用xml画出来的图形,点打印时:
       " 应用程序的组件中发生了未处理的异常,文件名、目录名或卷标语法不正确。。"
      

  2.   

    有可能是XML解析有问题,我曾经出过这样的问题
      

  3.   

    XML打印不正常的问题已解决,但"未将对象引用设置到对象实例"的问题仍然健在! :(
      

  4.   

    问题解决,正如楼上 houjianxun(三千弱水,独取一瓢清泉)所说是XML解析有问题,XML文件中某个元素缺少后就会报这个错但可以正常使用! :) :) :)