《2022年ArcGIS_Engine+C#_属性数据表的查询 .pdf》由会员分享,可在线阅读,更多相关《2022年ArcGIS_Engine+C#_属性数据表的查询 .pdf(7页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、ArcGIS Engine+C#_ 属性数据表的查询显示2012 年 06 月 19 日 星期二 14:33 本讲的思路大体如下:首先根据图层属性中的字段创建一个空的DataTable ,然后根据数据内容一行行填充DataTable 数据,再将DataTable 绑定到 DataGridView控件,最后调用并显示属性表窗体。1. 创建属性表窗体新建一个Windows 窗体,命名为“AttributeTableFrm.cs”。从工具箱拖一个DataGridView控件到窗体,并将其Dock 属性设置为“Fill”。添加如下引用:using ESRI.ArcGIS.Carto; using ES
2、RI.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 。 实现函数如下:/ / 根据图层字段创建一个只含字段的空D
3、ataTable / / / / 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
4、 pTable.Fields.FieldCount; i+) pField = pTable.Fields.get_Field(i); / 新建一个DataColumn 并设置其属性pDataColumn = new DataColumn(pField.Name); if (pField.Name = pTable.OIDFieldName) pDataColumn.Unique = true;/字段值是否唯一 / 字段值是否允许为空名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 1
5、 页,共 7 页 - - - - - - - - - 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) pD
6、ataColumn.MaxLength = pField.Length; / 字段添加到表中pDataTable.Columns.Add(pDataColumn); pField = null; pDataColumn = null; return pDataTable; 因为 GeoDatabase 的数据类型与 .NET 的数据类型不同,故要进行转换。转换函数如下:/ / 将 GeoDatabase 字段类型转换成.Net 相应的数据类型/ / 字段类型 / public static string ParseFieldType(esriFieldType fieldType) switc
7、h (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.esriFieldTypeGlobal
8、ID: 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.esriFieldTyp
9、eSingle: return System.Single; case esriFieldType.esriFieldTypeSmallInteger: 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - return System.Int32; case esriFieldType.esriFieldTypeString: return System.String; default: return System.String; 3
10、. 装载 DataTable 数据从上一步得到的DataTable 还没有数据, 只有字段信息。 因此, 我们要通过ICursor从 ITable中逐一取出每一行数据,即IRow。再创建DataTable 中相应的DataRow,根据 IRow 设置DataRow信息,再将所有的DataRow添加到 DataTable 中,就完成了DataTable 数据的装载。为保证效率,一次最多只装载2000 条数据到DataGridView 。函数代码如下: / / 填充 DataTable 中的数据/ / / / public static DataTable CreateDataTable(ILay
11、er pLayer, string tableName) / 创建空 DataTable DataTable pDataTable = CreateDataTableByLayer(pLayer, tableName); / 取得图层类型string shapeType = getShapeType(pLayer); / 创建 DataTable 的行对象DataRow pDataRow = null; / 从 ILayer查询到 ITable ITable pTable = pLayer as ITable; ICursor pCursor = pTable.Search(null, fal
12、se); / 取得 ITable中的行信息IRow pRow = pCursor.NextRow(); int n = 0; while (pRow != null) / 新建 DataTable 的行对象pDataRow = pDataTable.NewRow(); for (int i = 0; i pRow.Fields.FieldCount; i+) / 如果字段类型为esriFieldTypeGeometry,则根据图层类型设置字段值if (pRow.Fields.get_Field(i).Type = esriFieldType.esriFieldTypeGeometry) pDa
13、taRowi = shapeType; / 当图层类型为Anotation时,要素类中会有esriFieldTypeBlob类型的数据,/ 其存储的是标注内容,如此情况需将对应的字段值设置为Element else if (pRow.Fields.get_Field(i).Type = esriFieldType.esriFieldTypeBlob) pDataRowi = Element; 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - -
14、- - - else pDataRowi = pRow.get_Value(i); / 添加 DataRow到 DataTable pDataTable.Rows.Add(pDataRow); pDataRow = null; n+; / 为保证效率,一次只装载最多条记录if (n = 2000) pRow = null; else pRow = pCursor.NextRow(); return pDataTable; 上面的代码中涉及到一个获取图层类型的函数getShapeTape,此函数是通过ILayer判断图层类型的,代码如下:/ / 获得图层的Shape类型/ / 图层 / publ
15、ic static string getShapeType(ILayer pLayer) IFeatureLayer pFeatLyr = (IFeatureLayer)pLayer; switch (pFeatLyr.FeatureClass.ShapeType) case esriGeometryType.esriGeometryPoint: return Point; case esriGeometryType.esriGeometryPolyline: return Polyline; case esriGeometryType.esriGeometryPolygon: return
16、Polygon; default: return ; 4. 绑定 DataTable 到 DataGridView 通过以上步骤,我们已经得到了一个含有图层属性数据的DataTable 。现定义一个AttributeTableFrm类的成员变量:public DataTable attributeTable; 通过以下函数,我们很容易将其绑定到DataGridView控件中。名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 4 页,共 7 页 - - - - - - - - - / /
17、 绑定 DataTable 到 DataGridView / / public void CreateAttributeTable(ILayer player) string tableName; tableName = getValidFeatureClassName(player .Name ); attributeTable = CreateDataTable(player,tableName ); this.dataGridView1 .DataSource = attributeTable ; this.Text = 属性表 + tableName + + 记录数:+attribut
18、eTable.Rows.Count .ToString(); 因为 DataTable 的表名不允许含有“. ”,因此我们用“_”替换。函数如下:/ / 替换数据表名中的点/ / / public static string getValidFeatureClassName(string FCname) int dot = FCname.IndexOf(.); if (dot != -1) return FCname.Replace(., _); return FCname; 5. 调用属性表窗体通过 1-4 步骤,我们封装了一个AttributeTableFrm类,此类能够由ILayer显示
19、图层中的属性数据。那怎么调用AttributeTableFrm呢?前面已经提到,我们是在TOCControl 选中图层的右键菜单中弹出属性表窗体的,因此我们需要添加一个菜单项到TOCControl 中 Layer 的右键菜单。而在第六讲中,我们采用的是AE中的 IToolbarMenu实现右键菜单的,故我们还需自定义一个Command ,实现打开属性表的功能。以 ArcGIS 的 Base Command为模板新建项“OpenAttributeTable.cs”。注意:新建Base Command模板时,会弹出一个对话框让我们选择模板适用对象,这时我们要选择 MapControl 、PageL
20、ayoutControl,即选择第二项或者倒数第二项。添加如下引用:using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Display; using ESRI.ArcGIS.esriSystem; 添加成员变量: private ILayer m_pLayer; 修改构造函数为: public OpenAttributeTable(ILayer pLayer) / / TODO: Define values for the public properties / 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - -
21、- - - - 名师精心整理 - - - - - - - 第 5 页,共 7 页 - - - - - - - - - base.m_category = ; /localizable text base.m_caption = 打开属性表 ; /localizable text base.m_message = 打开属性表 ; /localizable text base.m_toolTip = 打开属性表 ; /localizable text base.m_name = 打开属性表 ; /unique id, non-localizable (e.g. MyCategory_MyComma
22、nd) m_pLayer = pLayer; try / / TODO: change bitmap name if necessary / string bitmapResourceName = GetType().Name + .bmp; base.m_bitmap = new Bitmap(GetType(), bitmapResourceName); catch (Exception ex) System.Diagnostics.Trace.WriteLine(ex.Message, Invalid Bitmap); 再在 On_Click 函数中添加如下代码,以创建并打开属性表窗体。
23、 / / Occurs when this command is clicked / public override void OnClick() / TODO: Add OpenAttributeTable.OnClick implementation AttributeTableFrm attributeTable = new AttributeTableFrm(); attributeTable.CreateAttributeTable(m_pLayer); attributeTable.ShowDialog(); 至此,我们完成了OpenAttributeTable命令。显然,我们要在
24、TOCControl 的 OnMouseDown事件中调用此命令。因为, 当前选中的图层参数,即 ILayer是通过 OpenAttributeTable的构造函数传入的,而选中的 ILayer是动态变化的,所以我们无法在窗体初始化的Form1_Load 事件中就添加OpenAttributeTable菜单项到右键菜单。但我们可以在OnMouseDown 事件中动态添加OpenAttributeTable菜单项。要注意的是,最后我们必须移除添加的OpenAttributeTable菜单项,不然每次按下右键都会添加此菜单项,将造成右键菜单中含有多个OpenAttributeTable菜单项。修改
25、 TOCControl 的 OnMouseDown 事件的部分代码如下: private void axTOCControl1_OnMouseDown(object sender, ITOCControlEvents_OnMouseDownEvent e) /,/ 弹出右键菜单if (item = esriTOCControlItem.esriTOCControlItemMap) m_menuMap.PopupMenu(e.x, e.y, m_tocControl.hWnd); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名
26、师精心整理 - - - - - - - 第 6 页,共 7 页 - - - - - - - - - if (item = esriTOCControlItem.esriTOCControlItemLayer) / 动态添加OpenAttributeTable菜单项m_menuLayer.AddItem(new OpenAttributeTable(layer), -1, 2, true, esriCommandStyles.esriCommandStyleTextOnly); m_menuLayer.PopupMenu(e.x, e.y, m_tocControl.hWnd); / 移除 OpenAttributeTable菜单项,以防止重复添加m_menuLayer.Remove(2); 名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 7 页,共 7 页 - - - - - - - - -