在水晶报表中加载ArcEngine地图

来源:互联网 发布:编程语音排行榜 编辑:程序博客网 时间:2024/04/28 21:29

 众所周知,水晶报表中动态更新,只能通过与数据库的连接实现,于是得出,若要将地图窗口的视图动态打印出来,可以通过以下这种思路:

        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;