|
|
|
|

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

在上一讲中,我们完成了图层符号选择器的制作。这一讲中,我们将实现图层属性数据表的查询显示。 在ArcMap中,单击图层右键菜单中的“Open Attribute Table”命令,便可弹出属性数据表。本讲将完成类似的功能,效果如下: 图1 数据表显示,我们用了Da...

作者:3SDN.Net来源:3SDN原创|2009年05月13日

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

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

图1

数据表显示,我们用了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设置DataTable的DataColumn,由此创建一个只含图层字段的空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";

}

}

上一篇:《ArcGIS Engine+C#实例开发教程》

下一篇:ArcGIS Engine+最短路径分析(C#源码)