为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

ArcGIS_Engine+C#_属性数据表的查询显示

2012-11-22 7页 doc 22KB 44阅读

用户头像

is_600833

暂无简介

举报
ArcGIS_Engine+C#_属性数据表的查询显示ArcGISEngine+C#_属性数据表的查询显示2012年06月19日星期二14:33 本讲的思路大体如下:首先根据图层属性中的字段创建一个空的DataTable,然后根据数据内容一行行填充DataTable数据,再将DataTable绑定到DataGridView控件,最后调用并显示属性表窗体。 1.创建属性表窗体 新建一个Windows窗体,命名为“AttributeTableFrm.cs”。 从工具箱拖一个DataGridView控件到窗体,并将其Dock属性设置...
ArcGIS_Engine+C#_属性数据表的查询显示
ArcGISEngine+C#_属性数据的查询显示2012年06月19日星期二14:33 本讲的思路大体如下:首先根据图层属性中的字段创建一个空的DataTable,然后根据数据内容一行行填充DataTable数据,再将DataTable绑定到DataGridView控件,最后调用并显示属性表窗体。 1.创建属性表窗体 新建一个Windows窗体,命名为“AttributeTableFrm.cs”。 从工具箱拖一个DataGridView控件到窗体,并将其Dock属性设置为“Fill”。 添加如下引用:usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Controls;usingESRI.ArcGIS.esriSystem;usingESRI.ArcGIS.SystemUI;usingESRI.ArcGIS.Geometry;usingESRI.ArcGIS.Geodatabase; 2.创建空DataTable首先传入ILayer,再查询到ITable,从ITable中的Fileds中获得每个Field,再根据Filed设置DataTable的DataColumn,由此创建一个只含图层字段的空DataTable。实现函数如下:  ///<summary>///根据图层字段创建一个只含字段的空DataTable///</summary>///<paramname="pLayer"></param>///<paramname="tableName"></param>///<returns></returns>privatestaticDataTableCreateDataTableByLayer(ILayerpLayer,stringtableName){//创建一个DataTable表DataTablepDataTable=newDataTable(tableName);//取得ITable接口ITablepTable=pLayerasITable;IFieldpField=null;DataColumnpDataColumn;//根据每个字段的属性建立DataColumn对象for(inti=0;i<pTable.Fields.FieldCount;i++){pField=pTable.Fields.get_Field(i);//新建一个DataColumn并设置其属性pDataColumn=newDataColumn(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;}returnpDataTable;}因为GeoDatabase的数据类型与.NET的数据类型不同,故要进行转换。转换函数如下:///<summary>///将GeoDatabase字段类型转换成.Net相应的数据类型///</summary>///<paramname="fieldType">字段类型</param>///<returns></returns>publicstaticstringParseFieldType(esriFieldTypefieldType){switch(fieldType){caseesriFieldType.esriFieldTypeBlob:return"System.String";caseesriFieldType.esriFieldTypeDate:return"System.DateTime";caseesriFieldType.esriFieldTypeDouble:return"System.Double";caseesriFieldType.esriFieldTypeGeometry:return"System.String";caseesriFieldType.esriFieldTypeGlobalID:return"System.String";caseesriFieldType.esriFieldTypeGUID:return"System.String";caseesriFieldType.esriFieldTypeInteger:return"System.Int32";caseesriFieldType.esriFieldTypeOID:return"System.String";caseesriFieldType.esriFieldTypeRaster:return"System.String";caseesriFieldType.esriFieldTypeSingle:return"System.Single";caseesriFieldType.esriFieldTypeSmallInteger:return"System.Int32";caseesriFieldType.esriFieldTypeString:return"System.String";default:return"System.String";}} 3.装载DataTable数据从上一步得到的DataTable还没有数据,只有字段信息。因此,我们要通过ICursor从ITable中逐一取出每一行数据,即IRow。再创建DataTable中相应的DataRow,根据IRow设置DataRow信息,再将所有的DataRow添加到DataTable中,就完成了DataTable数据的装载。 为保证效率,一次最多只装载2000条数据到DataGridView。函数代码如下: ///<summary>///填充DataTable中的数据///</summary>///<paramname="pLayer"></param>///<paramname="tableName"></param>///<returns></returns>publicstaticDataTableCreateDataTable(ILayerpLayer,stringtableName){//创建空DataTableDataTablepDataTable=CreateDataTableByLayer(pLayer,tableName);//取得图层类型stringshapeType=getShapeType(pLayer);//创建DataTable的行对象DataRowpDataRow=null;//从ILayer查询到ITableITablepTable=pLayerasITable;ICursorpCursor=pTable.Search(null,false);//取得ITable中的行信息IRowpRow=pCursor.NextRow();intn=0;while(pRow!=null){//新建DataTable的行对象pDataRow=pDataTable.NewRow();for(inti=0;i<pRow.Fields.FieldCount;i++){//如果字段类型为esriFieldTypeGeometry,则根据图层类型设置字段值if(pRow.Fields.get_Field(i).Type==esriFieldType.esriFieldTypeGeometry){pDataRow[i]=shapeType;}//当图层类型为Anotation时,要素类中会有esriFieldTypeBlob类型的数据,//其存储的是标注内容,如此情况需将对应的字段值设置为Elementelseif(pRow.Fields.get_Field(i).Type==esriFieldType.esriFieldTypeBlob){pDataRow[i]="Element";}else{pDataRow[i]=pRow.get_Value(i);}}//添加DataRow到DataTablepDataTable.Rows.Add(pDataRow);pDataRow=null;n++;//为保证效率,一次只装载最多条记录if(n==2000){pRow=null;}else{pRow=pCursor.NextRow();}}returnpDataTable;}上面的代码中涉及到一个获取图层类型的函数getShapeTape,此函数是通过ILayer判断图层类型的,代码如下:///<summary>///获得图层的Shape类型///</summary>///<paramname="pLayer">图层</param>///<returns></returns>publicstaticstringgetShapeType(ILayerpLayer){IFeatureLayerpFeatLyr=(IFeatureLayer)pLayer;switch(pFeatLyr.FeatureClass.ShapeType){caseesriGeometryType.esriGeometryPoint:return"Point";caseesriGeometryType.esriGeometryPolyline:return"Polyline";caseesriGeometryType.esriGeometryPolygon:return"Polygon";default:return"";}} 4.绑定DataTable到DataGridView通过以上步骤,我们已经得到了一个含有图层属性数据的DataTable。现定义一个AttributeTableFrm类的成员变量:publicDataTableattributeTable;通过以下函数,我们很容易将其绑定到DataGridView控件中。 ///<summary>///绑定DataTable到DataGridView///</summary>///<paramname="player"></param>publicvoidCreateAttributeTable(ILayerplayer){stringtableName;tableName=getValidFeatureClassName(player.Name);attributeTable=CreateDataTable(player,tableName);this.dataGridView1.DataSource=attributeTable;this.Text="属性表["+tableName+"]"+"记录数:"+attributeTable.Rows.Count.ToString();}因为DataTable的表名不允许含有“.”,因此我们用“_”替换。函数如下:///<summary>///替换数据表名中的点///</summary>///<paramname="FCname"></param>///<returns></returns>publicstaticstringgetValidFeatureClassName(stringFCname){intdot=FCname.IndexOf(".");if(dot!=-1){returnFCname.Replace(".","_");}returnFCname;}5.调用属性表窗体通过1-4步骤,我们封装了一个AttributeTableFrm类,此类能够由ILayer显示图层中的属性数据。那怎么调用AttributeTableFrm呢?前面已经提到,我们是在TOCControl选中图层的右键菜单中弹出属性表窗体的,因此我们需要添加一个菜单项到TOCControl中Layer的右键菜单。而在第六讲中,我们采用的是AE中的IToolbarMenu实现右键菜单的,故我们还需自定义一个Command,实现打开属性表的功能。以ArcGIS的BaseCommand为模板新建项“OpenAttributeTable.cs”。注意:新建BaseCommand模板时,会弹出一个对话框让我们选择模板适用对象,这时我们要选择MapControl、PageLayoutControl,即选择第二项或者倒数第二项。添加如下引用:usingESRI.ArcGIS.Carto;usingESRI.ArcGIS.Display;usingESRI.ArcGIS.esriSystem;添加成员变量: privateILayerm_pLayer;修改构造函数为: publicOpenAttributeTable(ILayerpLayer){////TODO:Definevaluesforthepublicproperties//base.m_category="";//localizabletextbase.m_caption="打开属性表";//localizabletextbase.m_message="打开属性表";//localizabletextbase.m_toolTip="打开属性表";//localizabletextbase.m_name="打开属性表";//uniqueid,non-localizable(e.g."MyCategory_MyCommand")m_pLayer=pLayer;try{////TODO:changebitmapnameifnecessary//stringbitmapResourceName=GetType().Name+".bmp";base.m_bitmap=newBitmap(GetType(),bitmapResourceName);}catch(Exceptionex){System.Diagnostics.Trace.WriteLine(ex.Message,"InvalidBitmap");}}再在On_Click函数中添加如下代码,以创建并打开属性表窗体。 ///<summary>///Occurswhenthiscommandisclicked///</summary>publicoverridevoidOnClick(){//TODO:AddOpenAttributeTable.OnClickimplementationAttributeTableFrmattributeTable=newAttributeTableFrm();attributeTable.CreateAttributeTable(m_pLayer);attributeTable.ShowDialog();}至此,我们完成了OpenAttributeTable命令。显然,我们要在TOCControl的OnMouseDown事件中调用此命令。 因为,当前选中的图层参数,即ILayer是通过OpenAttributeTable的构造函数传入的,而选中的ILayer是动态变化的,所以我们无法在窗体初始化的Form1_Load事件中就添加OpenAttributeTable菜单项到右键菜单。但我们可以在OnMouseDown事件中动态添加OpenAttributeTable菜单项。 要注意的是,最后我们必须移除添加的OpenAttributeTable菜单项,不然每次按下右键都会添加此菜单项,将造成右键菜单中含有多个OpenAttributeTable菜单项。 修改TOCControl的OnMouseDown事件的部分代码如下: privatevoidaxTOCControl1_OnMouseDown(objectsender,ITOCControlEvents_OnMouseDownEvente){//……//弹出右键菜单if(item==esriTOCControlItem.esriTOCControlItemMap)m_menuMap.PopupMenu(e.x,e.y,m_tocControl.hWnd);if(item==esriTOCControlItem.esriTOCControlItemLayer){//动态添加OpenAttributeTable菜单项m_menuLayer.AddItem(newOpenAttributeTable(layer),-1,2,true,esriCommandStyles.esriCommandStyleTextOnly);m_menuLayer.PopupMenu(e.x,e.y,m_tocControl.hWnd);//移除OpenAttributeTable菜单项,以防止重复添加m_menuLayer.Remove(2);}} 
/
本文档为【ArcGIS_Engine+C#_属性数据表的查询显示】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑, 图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索