关于ArcEngine10二次开发,如何在插件窗体内实现如同ArcMap一样的保存数据对话框功能(附源码)

关于ArcEngine10二次开发,如何在插件窗体内实现如同ArcMap一样的保存数据对话框功能(附源码)_第1张图片        关于ArcEngine10二次开发,如何在插件窗体内实现如上图所示的与ArcMap一样的保存数据对话框功能?首先,Windows窗体工具箱的SaveFileDialog对话框肯定不行,此对话框虽然可以自定义文件保存类型(保存shp文件可以),但是无法保存MDB和GDB数据库文件。其次,在网上找了很久,都未找到问题的解决方案。本着求人不如求己的原则,最后还是通过查询ArcObjects Help for .NET developers官方文档才如愿以偿地找到了满意答案。于是便决定写下此博文,为后面遇到同样问题的朋友提供一条解决问题的思路。

        要实现上图所示的保存数据对话框功能,我们需要利用到ArcObjects的CatalogUI命名空间下的IGxDialog接口。IGxDialog接口由GxDialog对象实现,并提供对对话框对象属性的访问,以及在打开或保存操作期间显示对话框的方法。当希望访问对话框的属性或希望显示对话框以供最终用户输入时,请使用此接口。接口成员如下:

关于ArcEngine10二次开发,如何在插件窗体内实现如同ArcMap一样的保存数据对话框功能(附源码)_第2张图片

        ArcGis常用的矢量数据分为数据库类型和Shp类型,因此我们就要限定我们的保存对话框的可保存文件类型为“文件和个人地理数据库要素类”以及“Shapefle”。要实现这个功能,需要用到CatalogUI命名空间下的IGxObjectFilterCollection接口,以及ArcEngine二次开发必须掌握的接口跳转功能。接口成员如下:

关于ArcEngine10二次开发,如何在插件窗体内实现如同ArcMap一样的保存数据对话框功能(附源码)_第3张图片

        IGxObjectFilterCollection接口是一个IGxObject的筛选器集合,通过它的AddFilter方法,可添加各种文件类型的筛选器。这里我们主要想设置GIS矢量文件的保存类型,因此我们只需添加“文件和个人地理数据库要素类”(GxFilterPGDBFeatureClasses)以及“Shapefle”(GxFilterShapefilesClass)筛选器。然后利用接口跳转将IGxObjectFilterCollection转化为IGxDialog,便完成了保存对话框的文件类型筛选设置。最后,利用IGxDialog的DoModalSave方法,便可实现如同ArcMap一样的保存数据对话框功能。

        对话框功能实现以后,还需要完成对用户选择的保存路径及输入的数据名称的记录,此为重点亦为难点,因为IGxDialog的DoModalSave方法并没有像DoModalopen方法一样的返回值,网上也很难找到现成的解决方案,最后又只能求己。

关于ArcEngine10二次开发,如何在插件窗体内实现如同ArcMap一样的保存数据对话框功能(附源码)_第4张图片

        通过查阅IGxDialog接口的成员信息,发现要获取用户已选择的保存路径,可以利用IGxDialog的FinalLocation属性,即对话框最后定位的位置。要获取用户输入的要保存的数据名,可以利用IGxDialog的Name属性,该属性即为保存对话框中用户输入的文本。获取了这两个信息后,即可将文件路径拼接起来,写入到记录文件位置的文本框中。

         有了完整的文件路径,我们便可轻松完成对矢量数据的保存。从而在插件窗体内实现如同ArcMap一样的保存数据对话框功能。具体代码如下:

using ESRI.ArcGIS.Catalog;
using ESRI.ArcGIS.CatalogUI;
using System;
using System.Windows.Forms;


namespace ArcMapAddin1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            this.Hide();
            IGxObjectFilterCollection IGxFilters = new GxDialogClass();
            IGxObjectFilter IGxfilter1 = new GxFilterPGDBFeatureClassesClass();
            IGxFilters.AddFilter(IGxfilter1, false);
            IGxObjectFilter IGxfilter2 = new GxFilterShapefilesClass();
            IGxFilters.AddFilter(IGxfilter2, false);

            IGxDialog pGxDialog = IGxFilters as IGxDialog;//接口跳转
            pGxDialog.RememberLocation = true;
            pGxDialog.Title = "保存矢量";
            pGxDialog.AllowMultiSelect = false;

           if(pGxDialog.DoModalSave(0))
            {
                textBox1.Text = System.IO.Path.Combine(pGxDialog.FinalLocation.FullName, pGxDialog.Name).ToString();
            }
           else
           {
                MessageBox.Show("未选择矢量保存路径!", "提示");
                textBox1.Text = "";
           }
           this.Show();           
        }
    }
}

你可能感兴趣的:(c#,arcgis)