『公告』 预祝您龙年大吉,万事如意, 过节期间, 大家如需数据服务,请拨打400 或直接添加客服微信,再祝大家龙年,心想事成。
关注我们 新浪 腾讯

《ArcGIS Engine+C#实例开发教程》第八讲 属性数据表的查询显示

《ArcGIS Engine+C#实例开发教程》第八讲 属性数据表的查询显示
这一讲中,我们将实现图层属性数据表的查询显示。在ArcMap中,单击图层右键菜单中的“Open Attribute Table”命令,便可弹出属性数据表。本讲将完成类似的功能.

       在上一讲中,我们完成了图层符号选择器的制作。这一讲中,我们将实现图层属性数据表的查询显示。

       在ArcMap中,单击图层右键菜单中的“Open Attribute Table”命令,便可弹出属性数据表。本讲将完成类似的功能,效果如下:


       数据表显示,我们用了DataGridView控件。DataGridView 控件提供一种强大而灵活的以表格形式显示数据的方式。可以使用 DataGridView 控件来显示少量数据的只读视图,也可以对其进行缩放以显示特大数据集的可编辑视图。我们可以很方便地把一个DataTable作为数据源绑定到DataGridView控件中。

       本讲的思路大体如下:首先根据图层属性中的字段创建一个空的DataTable,然后根据数据内容一行行填充DataTable数据,再将DataTable绑定到DataGridView控件,最后调用并显示属性表窗体。

       1.创建属性表窗体

       新建一个Windows窗体,命名为“AttributeTableFrm.cs”。

       从工具箱拖一个DataGridView控件到窗体,并将其Dock属性设置为“Fill”。

       添加如下引用:

       using ESRI.ArcGIS.Carto;

       using ESRI.ArcGIS.Controls;

       using ESRI.ArcGIS.esriSystem;

       using ESRI.ArcGIS.SystemUI;

       using ESRI.ArcGIS.Geometry;

       using ESRI.ArcGIS.Geodatabase;

       2.创建空DataTable

       首先传入ILayer,再查询到ITable,从ITable中的Fileds中获得每个Field,再根据Filed设置DataTableDataColumn,由此创建一个只含图层字段的空DataTable。实现函数如下:

       /// <summary>

       /// 根据图层字段创建一个只含字段的空DataTable

       /// </summary>

       /// <param name="pLayer"></param>

       /// <param name="tableName"></param>

       /// <returns></returns>

       private static DataTable CreateDataTableByLayer(ILayer pLayer, string tableName)

       {

       //创建一个DataTable

       DataTable pDataTable = new DataTable(tableName);

       //取得ITable接口

       ITable pTable = pLayer as ITable;

       IField pField = null;

       DataColumn pDataColumn;

       //根据每个字段的属性建立DataColumn对象

       for (int i = 0; i < pTable.Fields.FieldCount; i++)

       {

       pField = pTable.Fields.get_Field(i);

       //新建一个DataColumn并设置其属性

       pDataColumn = new DataColumn(pField.Name);

       if (pField.Name == pTable.OIDFieldName)

       {

       pDataColumn.Unique = true;//字段值是否唯一

       }

       //字段值是否允许为空

       pDataColumn.AllowDBNull = pField.IsNullable;

       //字段别名

       pDataColumn.Caption = pField.AliasName;

       //字段数据类型

       pDataColumn.DataType = System.Type.GetType(ParseFieldType(pField.Type));

       //字段默认值

       pDataColumn.DefaultValue = pField.DefaultValue;

       //当字段为String类型是设置字段长度

       if (pField.VarType == 8)

       {

       pDataColumn.MaxLength = pField.Length;

       }

       //字段添加到表中

       pDataTable.Columns.Add(pDataColumn);

       pField = null;

       pDataColumn = null;

       }

       return pDataTable;

       }

       因为GeoDatabase的数据类型与.NET的数据类型不同,故要进行转换。转换函数如下:

       /// <summary>

       /// GeoDatabase字段类型转换成.Net相应的数据类型

       /// </summary>

       /// <param name="fieldType">字段类型</param>

       /// <returns></returns>

      public static string ParseFieldType(esriFieldType fieldType)

       {

       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";

       }

       }

      京ICP备2025132830号-1 京公网安备 号