ArcGisEngine实现显示属性表:
效果:
一、拖入DataGridView
从工具箱拖一个DataGridView控件到窗体.
二、创建空的DataTable
首先传入ILayer,在查询ITable,在从ITable中的Filed中的Fileds中获取每个Field,在根据Field设置DataTable的DataColumn,由此创建一个空的DataTable
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的数据类型不同,故要进行转换。转换函数如下: 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"; } }
三、装载数据:
public static DataTable CreateDataTable(ILayer 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, false); //取得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) { pDataRow[i] = shapeType; } //当图层类型为Anotation时,要素类中会有esriFieldTypeBlob类型的数据, //其存储的是标注内容,如此情况需将对应的字段值设置为Element else if (pRow.Fields.get_Field(i).Type == esriFieldType.esriFieldTypeBlob) { pDataRow[i] = "Element"; } else { pDataRow[i] = pRow.get_Value(i); } } //添加DataRow到DataTable pDataTable.Rows.Add(pDataRow); pDataRow = null; n++; //为保证效率,一次只装载最多条记录 if (n == 2000) { pRow = null; } else { pRow = pCursor.NextRow(); } } return pDataTable; } public 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 "Polygon"; default: return ""; } }
四、绑定DataTable到DataGridView
public void CreateAttributeTable(ILayer player) { string tableName; tableName = getValidFeatureClassName(player.Name); attributeTable = CreateDataTable(player, tableName); this.dataGridView1.DataSource = attributeTable; this.Text = "属性表[" + tableName + "] " + "记录数:" + attributeTable.Rows.Count.ToString(); } public static string getValidFeatureClassName(string FCname) { int dot = FCname.IndexOf("."); if (dot != -1) { return FCname.Replace(".", "_"); } return FCname; }
五、调用并显示:
1.在axTOCControl1_OnMouseDown方法中得到ILayer,赋countTableLayer.
if (e.button == 2) { axMapControl1.CustomProperty = pLyr; //将当前图层传给countTableLayer.便于在功能5中使用 countTableLayer = pLyr; if (pLyr != null && pItem == esriTOCControlItem.esriTOCControlItemLayer) contextMenuStrip1.Show(axTOCControl1, e.x, e.y); }
2.在显示属性表ToolStripMenuItem_Click()中调用.
private void 显示属性表ToolStripMenuItem_Click(object sender, EventArgs e) { CreateAttributeTable(countTableLayer); }
六、更多及详情:
http://www.gissky.net/Article/1574.htm
相关推荐
代码实现了双击图层弹出属性表。代码是建立在arcgis engine的C#语言基础上实现的。
思路大体如下:首先根据图层属性中的字段创建一个空的DataTable,然后根据数据内容一行行填充DataTable数据,再将DataTable绑定到DataGridView控件,最后调用并显示属性表窗体。
AD域属性对照表
这里实现两个基本的 GIS 软件需求:矢量图层的属性表显示,以及根据属性筛选要素。 具体需求如下: 1、加载一个矢量图层并打开其属性表; 2、输入筛选条件确认无误后,画布上和属性表中均只显示筛选后的要素。 属性...
ArcEngine属性表自定义控件,可实现矢量数据属性表的加载,分页显示,排序、选择要素属性显示等功能(注:需结合本人写的表格分页自定义控件使用,见本人上传资源)
c# 基于mapx 基本操作放大、漫游、缩小滚轮放大缩小 单击图层中任意要素便显示相应属性信息 动态图层控制 属性表的连接 属性与地图互查 鹰眼
GIS api sl 移动鼠标显示属性信息
地图的点选查询,并且有属性表输出,选择自己的地图,
MFC VC++属性页和属性表源码
matlab开发-属性gui显示属性naneditablecontextawaretable。属性在上下文感知的GUI表中处理和显示数据属性列表
应用TAB control+属性页制作的属性页,单文档,点击帮助里面的KAISHI菜单可以显示属性表对话框。
代码经我调试运行可行,目前没有出现bug,也希望大家提出修正意见。 代码主要实现了自己设置查询语句,查询结果在地图上闪烁,居中显示并且高亮
JS控制明细列显示隐藏 同时控制字段必填属性.js
//显示属性表 CRect rcSheet; GetDlgItem( IDC_PROPSHEET )->GetWindowRect( &rcSheet ); ScreenToClient( &rcSheet ); m_MyPropertySheet.SetWindowPos( NULL, rcSheet.left-7, rcSheet.top-7, 0, 0, SWP_...
包括实现右击TOC可以显示数据属性表、删除图层,双击Map可以识别地图属性 备份连接:链接:https://pan.baidu.com/s/17WZKqTY8Cb2TsX4PSLDfIw 提取码:tqto 教程博客:...
用VisualStudio2008创建的农历属性节气显示系统的日历表,渐变显示。
check框控制显示隐藏明细表(隐藏清空明细表)
从Sql server 2008获取表字段属性信息,注释信息 。注意,字段说明除非有备注才显示,如果没有的的情况下显示空白是正常的。
微软数据库管理软件SSMS中在表设计器中显示说明等列属性
属性页实现选项卡的实例 博文链接:https://fpwjp.iteye.com/blog/390765