2022年ArcGISEngine+C#_属性数据表的查询显示 .pdf

上传人:Che****ry 文档编号:34264492 上传时间:2022-08-15 格式:PDF 页数:7 大小:54.62KB
返回 下载 相关 举报
2022年ArcGISEngine+C#_属性数据表的查询显示 .pdf_第1页
第1页 / 共7页
2022年ArcGISEngine+C#_属性数据表的查询显示 .pdf_第2页
第2页 / 共7页
点击查看更多>>
资源描述

《2022年ArcGISEngine+C#_属性数据表的查询显示 .pdf》由会员分享,可在线阅读,更多相关《2022年ArcGISEngine+C#_属性数据表的查询显示 .pdf(7页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

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 页 - - - - - - - - -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com