ArcGIS Engine 系统开发设计(三):属性表的访问与显示

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/ahlxt123/article/details/38245783

这里主要是访问并显示shapefile的属性表~


大致思路如下:新建一个Form用来获取选中要素的属性表,而在初始界面右键点击对应的矢量要素后,便打开新form将要素属性表展示出来。

下面就开始咯~

首先要添加ESRI.ArcGIS.Controls、Geodatabase的引用,更新命名空间;

然后我们添加一个用于显示属性表内容新的 Form 窗体,在这个新的窗体上添加 dataGridView 控件,并添加Column。


在Form2中,我们先将可能获得的属性表数据类型进行预定义:

  public static string ParseFieldType(esriFieldType fieldType)//将EsriType 转换为String
        {
            switch (fieldType)
            {
                case esriFieldType.esriFieldTypeBlob:
                    return "System.String";
                case esriFieldType.esriFieldTypeDate:
                    return "System.DateTime";
                case esriFieldType.esriFieldTypeDouble:
                    return "System.Double";
                case esriFieldType.esriFieldTypeGeometry:
                    return "System.String";
                case esriFieldType.esriFieldTypeGlobalID:
                    return "System.String";
                case esriFieldType.esriFieldTypeGUID:
                    return "System.String";
                case esriFieldType.esriFieldTypeInteger:
                    return "System.Int32";
                case esriFieldType.esriFieldTypeOID:
                    return "System.String";
                case esriFieldType.esriFieldTypeRaster:
                    return "System.String";
                case esriFieldType.esriFieldTypeSingle:
                    return "System.Single";
                case esriFieldType.esriFieldTypeSmallInteger:
                    return "System.Int32";
                case esriFieldType.esriFieldTypeString:
                    return "System.String";
                default:
                    return "System.String";
            }
        }

然后就是获取shpaefile的属性表了,这里我们主要使用 IField、IFeatureCursor、IFeature 这三个接口来达成目标:

接口说明如下:

IField 接口:用于获取要素表。

IFeature 接口:用来接收查询出来的要素。

IFeatureCursor 接口:通过Search进行查询,可以将结果保存在这里,从而利用NextFeature方法,遍历所有要素。

代码如下:

 public void Opentable()
        {
            IFields pFields;
            pFields = pFeaturelayer.FeatureClass.Fields;
            dataGridView1.ColumnCount = pFields.FieldCount;
            for (int i = 0; i < pFields.FieldCount; i++)
            {
                string fldName = pFields.get_Field(i).Name;
                dataGridView1.Columns[i].Name = fldName;
                dataGridView1.Columns[i].ValueType = System.Type.GetType(ParseFieldType(pFields.get_Field(i).Type));
            }
            IFeatureCursor pFeatureCursor;
            pFeatureCursor = pFeaturelayer.FeatureClass.Search(null, false);
            IFeature pFeature;
            pFeature = pFeatureCursor.NextFeature();
            while (pFeature != null)
            {
                string[] fldValue = new string[pFields.FieldCount];
                for (int i = 0; i < pFields.FieldCount; i++)
                {
                    string fldName;
                    fldName = pFields.get_Field(i).Name;
                    if (fldName == pFeaturelayer.FeatureClass.ShapeFieldName)
                    {
                        fldValue[i] = Convert.ToString(pFeature.Shape.GeometryType);
                    }
                    else
                        fldValue[i] = Convert.ToString(pFeature.get_Value(i));
                }
                dataGridView1.Rows.Add(fldValue);
                pFeature = pFeatureCursor.NextFeature();
            }
        }


搞定~接下来就是在初始界面选定要素后跳转界面显示属性表了~

先在form1中进行预定义:

        IFeatureLayer pFeatureLayer = null;
        public IFeatureLayer pGlobalFeatureLayer; //定义全局变量
        public ILayer player;


因为决定在右击鼠标时显示选项,在Form1窗体中添加contextMenuStrip控件,添加选项”显示属性表“,在click事件中打开新form:

Form2 Ft = new Form2(player as IFeatureLayer);
            Ft.Show();

然后就保证右键点击相关图层要素后能够成功打开对应属性表啦,这里主要用了TOCControl的 HitTest()方法:

publicvoid HitTest ( int X, int Y, ref esriTOCControlItem ItemType, ref IBasicMapBasicMap, ref ILayer Layer, ref object Unk, ref object Data );

其中 X,Y:鼠标点击的坐标;

ITemType:esriTOCControlItem枚举常量

BasicMap:绑定MapControl的IBasicMap接口

Layer:被点击的图层

Unk:TOCControl的LegendGroup对象

Data:LegendClass在LegendGroup中的Index。


在TOCControl控件的 OnMouseDown 事件下添加如下代码即可~:

            if (axMapControl1.LayerCount > 0)
            {
                esriTOCControlItem pItem = new esriTOCControlItem();
                pGlobalFeatureLayer = new FeatureLayerClass();
                IBasicMap pBasicMap = new MapClass();
                object pOther = new object();
                object pIndex = new object();
                axTOCControl1.HitTest(e.x, e.y, ref pItem, ref  pBasicMap, ref player, ref pOther, ref pIndex);
            }
            if (e.button == 2)
            {
                contextMenuStrip1.Show(axTOCControl1, e.x, e.y);
            }


大功告成~~

运行结果如下:

右击显示属性表:


点击后出现属性表~~~:




猜你喜欢

转载自blog.csdn.net/ahlxt123/article/details/38245783
今日推荐