众所周知 , 水晶报表中动态更新, 只能通过与数据库的连接实现, 于是得出 , 若要将地图窗口的视图动态打印出来, 可以通过以下这种思路:
1. 构建数据表,最好是在本地,避免网络耗时;在其中添加blob 字段。
2. 程序中加载Crystal viewer ,与报表关联;
3. 编程获取mapcontrol 的当前视图,并导出为图像格式;
4. 将ArcEngine 导出的图片通过二进制格式读入到报表关联的数据库blob 字段中;
5. 针对水晶报表中blob 字段对应的对象,则可以显示出欲打印的地图。
部分参考代码如下:
private void simpleButton1_Click(object sender, System.EventArgs e)
{
IObjectCopy ObjectCopy = new ESRI.ArcGIS.esriSystem.ObjectCopyClass ();
//输出图片代码
Form2 frm = new Form2();
frm.ShowDialog();
}
private void Form2_Load(object sender, System.EventArgs e)
{
YSSQ cr = new YSSQ();
DataSet ds = new DataSet (); String path;
DataColumn column = new DataColumn (); DataRow row;
// 调整格式
BlobFieldObject BObj;
BObj = cr.ReportDefinition.ReportObjects["XMTB1" ] as BlobFieldObject;
// 构造一个对应于xsd 文件的表结构
ds.Tables.Add("Map" );
ds.Tables[0].Columns.Add("XMBH" , System.Type .GetType("System.String" ));
ds.Tables[0].Columns.Add("XMTB" , System.Type .GetType("System.Byte[]" ));
// 写入数据
path = "1053.jpg" ;
row = ds.Tables[0].NewRow();
row[0] = "J0000001" ;
FileStream fs = new FileStream (path, FileMode .Open);// 获取文件流
BinaryReader br = new BinaryReader (fs);// 创建二进制读取对象
int len = (int )br.BaseStream.Length;
row[1] = br.ReadBytes(len);
ds.Tables[0].Rows.Add(row);
br.Close(); fs.Close();
cr.SetDataSource(ds);
this .crystalReportViewer1.ReportSource = cr;