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