1. |
      |
      |

      《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#源碼)

      色AV永久无码AV影院