C#+ArcEgine开发(3)属性表的各种操作(1)

利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用 利用ArcGIS Engine、VS .NET和Windows控件开发GIS应用 Dixon整理 此过程说明适合那些使用.NET建立和部署应用的开发者,它描述了使用ArcGIS控件建立和部署应用的方法和步骤。 你可以在下面的目录下找到相应的样例程序: <安装目录>"DeveloperKit"Samples"Developer_Guide_Scenarios" ArcGIS_En... 阅读详情

书上的例子不大好,还好网上资料挺多。

就参考网上各种资料的学习过程: https://blog.youkuaiyun.com/lysc_forever/article/details/17093405
这篇写得很详细了,不过,根据我自己的情况,有些方面修改了一下。
---------------------------------------------------------------------------------------------------------------------

一、打开属性表
1、将contextMenuStrip拖到控件上,再添加一个“打开属性表”。这就是TOCCControl的右键菜单了

2、新建一个窗体文件AttributeTable,将menuStrip和dataGridView拖到窗体上。menuStrip上还会加一些功能,之后再说,现在先不管。

代码如下:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.esriSystem;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.Geometry;
using ESRI.ArcGIS.Geodatabase;

namespace demo1地图浏览
{
    public partial class AttributeTable : Form
    {
        public DataTable attributeTable;
        ILayer mLayer;
        public AttributeTable(ILayer layer)
        {
            InitializeComponent();
            mLayer = layer;
        }
       
        private void AttributeTable_Load(object sender, EventArgs e)
        {
            IFeatureLayer pFeatureLayer = mLayer as IFeatureLayer;
            IFeatureClass pFeatureClass = pFeatureLayer.FeatureClass;
            DataTable dt = new DataTable();
            if (pFeatureClass != null)
            {
                DataColumn dc;
                for (int i = 0; i < pFeatureClass.Fields.FieldCount; i++)
                {
                    dc = new DataColumn(pFeatureClass.Fields.get_Field(i).Name);
                    dt.Columns.Add(dc);//获取所有列的属性值
                }
                IFeatureCursor pFeatureCursor = pFeatureClass.Search(null, false);
                IFeature pFeature = pFeatureCursor.NextFeature();
                DataRow dr;
                while (pFeature != null)
                {
                    dr = dt.NewRow();
                    for (int j = 0; j < pFeatureClass.Fields.FieldCount; j++)
                    {
                        //判断feature的形状
                        if (pFeature.Fields.get_Field(j).Name == "Shape")
                        {
                            if (pFeature.Shape.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPoint)
                            {
                                dr[j] = "点";
                            }
                            if (pFeature.Shape.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolyline)
                            {
                                dr[j] = "线";
                            }
                            if (pFeature.Shape.GeometryType == ESRI.ArcGIS.Geometry.esriGeometryType.esriGeometryPolygon)
                            {
                                dr[j] = "面";
                            }
                        }
                        else
                        {
                            dr[j] = pFeature.get_Value(j).ToString();//增加行
                        }
                    }
                    dt.Rows.Add(dr);
                    pFeature = pFeatureCursor.NextFeature();
                }
                dataGridView1.DataSource = dt;
            }
        }
    }
}

3、回到主窗体,添加TOCCControl的OnMouseDown事件,其实就是右键

 public ILayer layer;  //这个是全局变量
        private void axTOCControl1_OnMouseDown(object sender, ESRI.ArcGIS.Controls.ITOCControlEvents_OnMouseDownEvent e)
        {
            if (e.button == 2)
            {
                esriTOCControlItem item = esriTOCControlItem.esriTOCControlItemNone;
                IBasicMap map = new MapClass();
                layer = new FeatureLayerClass();
                object other = new object();
                object index = new object();
                axTOCControl1.HitTest(e.x, e.y, ref item, ref map, ref layer, ref other, ref index); //实现赋值,ref的参数必须初始化
                if (item == esriTOCControlItem.esriTOCControlItemLayer) ////点击的是图层的话,就显示右键菜单
                {
                    contextMenuStrip1.Show(axTOCControl1, new System.Drawing.Point(e.x, e.y));
                }
            }

        }

再在“打开属性表”上点两下,其实是添加它的Click事件

  private void 打开属性表ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AttributeTable attributeTable = new AttributeTable(layer);
            attributeTable.Text = "属性表:" + layer.Name;
            attributeTable.ShowDialog();
        }

打开属性表的功能就完成了,看看效果

二、点击属性表上的数据,图层上高亮显示
上一步骤里面主窗体里的有一段代码是这样的
private void 打开属性表ToolStripMenuItem_Click(object sender, EventArgs e)
        {
            AttributeTable attributeTable = new AttributeTable(layer);
            attributeTable.Text = "属性表:" + layer.Name;
            attributeTable.ShowDialog();
        }
改成这样:其实就是换成this了,把主窗体传进子窗体,便于在子窗体调用主窗体的控件。把axMapControl控件的Modifier属性改为public。(其实这样用不大好,最好是用委托,但先这样吧,委托等我以后再说)
  private void 打开属性表ToolStripMenuItem_Click(object sender, EventArgs e)
        {
           
            AttributeTable attributeTable = new AttributeTable(this);
            attributeTable.Text = "属性表:" + layer.Name;
            attributeTable.ShowDialog();
        }

然后到AttributeTable里去,加个全局变量 private Form1 form。把构造函数改成这样:

 private Form1 form1;
        public AttributeTable(Form1 form1)
        {
            InitializeComponent();
            this.form1 = form1;
            mLayer = form1.layer;
           
        }

添加dataGridView的RowHeaderMouseClick事件,选中高亮显示的代码如下:

//选中高亮显示
       
        private void dataGridView1_RowHeaderMouseClick(object sender, DataGridViewCellMouseEventArgs e)
        {
            IQueryFilter pQuery = new QueryFilterClass();
            int count = this.dataGridView1.SelectedRows.Count;
            string val, col;
            col = this.dataGridView1.Columns[0].Name;
            //当只选中一行时
            if (count == 1)
            {
                val = this.dataGridView1.SelectedRows[0].Cells[col].Value.ToString();
                //设置高亮要素的查询条件
                pQuery.WhereClause = col + "=" + val;
            }
            else//选中多行
            {
                int i;
                string str;
                for (i = 0; i < count - 1; i++)
                {
                    val = this.dataGridView1.SelectedRows[i].Cells[col].Value.ToString();
                    str = col + "=" + val + "OR";
                    pQuery.WhereClause += str;
                }
                //添加最后一个要素的条件
                val = this.dataGridView1.SelectedRows[i].Cells[col].Value.ToString();
                str = col + "=" + val;
                pQuery.WhereClause += str;

            }
            //ILayer pLayer = (ILayer)m_mapControl.CustomProperty;
            IFeatureLayer pFLayer = mLayer as IFeatureLayer;
            IFeatureSelection pFeatSelection;
            pFeatSelection = pFLayer as IFeatureSelection;
            pFeatSelection.SelectFeatures(pQuery, esriSelectionResultEnum.esriSelectionResultNew, false);
            IViewRefresh viewRefresh = form1.axMapControl1.Map as IViewRefresh;
            viewRefresh.ProgressiveDrawing = true;
            viewRefresh.RefreshItem(mLayer);
        }

效果就是这样的:

这一篇先写这两个操作,还有一些操作就写到下一篇里了

【C#】C#扩展类方法及Arcgis Geometry字段扩展ToWkt方法 C#扩展类方法的应用及Arcgis Geometry字段扩展ToWkt方法 阅读详情

相关推荐

ArGIS Engine专题(3)之矢量栅格属性表(分页异步加载,解决大数据量加载一种方式)

对于数据量小时,直接一次性显示所有数据完全没有问题,然而在实际应用中往往数据量都较大,尤其是GIS空间数据,有时甚至可以达到百万级、千万级,如果没有好的设计逻辑,往往会出现假死、无响应、反应超级慢,甚至会出现内存不足,而直接闪退,在用户体验上极差。 为了解决大数据量加载问题,本文将采用分页、异步加载的方式来实现。 目录 一、实现属性数据分页 (1)arcengine提供了IQueryFilterDefinition3可以实现分页 (2)直接通过IQueryFilter结合ITable查询检索 二

wokao253615105的专栏 570

arcengine实现打开属性表功能

附带有几个arcengine常用的功能。arcengine开始编辑,保存编辑 删除字段,添加字段,字段计算器,字段计算器,导出表。 qq:2953736698

qq_36306457的博客 1340

ArcEgine开发实战资料

里面收集了多个关于AE开发的详细代码文档,基本覆盖了所有功能

C#+ArcEgine开发----理论学习(1)

一、组件对象模型COM即为组件对象模型,是关于如何建立组件,以及如何通过组件建立应用程序的一个规范。COM是开发软件组件的一种方法,组件实际上是小的二进制可执行程序。二、ArcGIS Egine的逻辑体系结构1、Base Services包含了ArcEgine中最核心的ArcObjects组件,几乎所有的GIS组件需要调用它们,如Geometry和Display等ArcObjects与其他Arc产...

小陆同学LLR的博客 728

【AIGC】人工智能训练师(高级)考试题库-橙点同学

例如,在嘈杂的环境中进行声音转文字,即使是优秀的模型也可能会出现一些错误,但这并不意味着该模型本身质量差,在其他较为理想的环境下,它可能会有很好的表现。例如,在一些语音应用和系统中,会使用SSML来实现对语音合成的精细控制,如调整语速、语调、音量等,而这些应用和系统的开发往往会遵循W3C的相关标准和框架,其中就包括SSML这一语音合成标记语言。例如,在语音识别等场景中,像“去火车站怎么走”这样的语音指令,没有其他嘈杂的背景声音或模糊不清的表述,就属于无噪音的数据,有利于系统准确地进行处理和分析。

RisunJan的博客 9920

【信创-k8s】银河麒麟V10国防版+鲲鹏/飞腾(arm64架构)在线/离线部署k8s1.30+kubesphere

银河麒麟作为国家核高基专项的重要成果,国防版凭借其卓越的安全性和可靠性,已成为军工领域的首选操作系统。之前我们在适配麒麟V4国防版的过程中已发现诸多安全性要求,而麒麟V10国防版在安全防护等级上又达到了更高的级别。本文将主要演示离线部署,因为军工项目基本不会出现联网场景。即使在线,也可以按离线方式部署,且离线部署由于有私有仓库,不会存在镜像获取不到和丢失情况。

jiaworld的博客 730

C#属性如何写

C#属性的定义和调用

sykxbn的博客 329

GROMACS新手必看:从PDB文件到完整分子动力学模拟的保姆级教程

本文提供GROMACS分子动力学模拟的保姆级教程,从PDB文件处理到完整模拟流程全覆盖。详细讲解结构预处理、系统构建、能量最小化、生产模拟等关键步骤,并分享性能优化和结果分析技巧,帮助新手快速掌握分子动力学模拟的核心操作。

yhn456789的博客 763

在ArcEngine中调用ArcMap属性表

@ArcEngine调用ArcMap属性表 在ArcEngine中调用ArcMap属性表 ///调用arcgis属性表 ESRI.ArcGIS.GeoDatabaseUI.TableView t = new ESRI.ArcGIS.GeoDatabaseUI.TableViewClass(); t.TableSelectionAction = ESRI.ArcGIS.GeoDatabaseUI.esriTableSelectionActions.esriDr

qq_25138931的博客 879

ros2 humble中使用realsense t265与d435

前提,安装realsense SDK 2.51.1版本并且能成功启动realsense-viewer V2.51.1想要在ros2中使用realsense t265,必须配合realsense SDK v2.51.1使用realsense-ros 4.51.1版本,因为新版本realsense ros2不再对t265支持下面记录源码编译安装 realsense-ros 4.51.1版本。

m0_72797388的博客 952

一文读懂AI大模型时代的RAG技术

RAG(Retrieval-Augmented Generation,检索增强生成) 是一种结合检索技术与生成模型的技术架构,旨在通过动态引入外部知识库增强大语言模型(LLM)的生成能力。其核心思想是通过检索系统从外部数据源(如企业知识库、实时文档等)获取相关信息,并将检索结果作为上下文输入生成模型,以提高生成答案的准确性、时效性和专业性

awei0916的专栏 2118

C#+ArcEngine:加载打开Shp矢量数据和栅格数据(VS2010窗体+代码)

分享给有需要的人,代码质量勿喷。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Fo...

累了就要打游戏 7420

Linux运维踩坑实录:手把手教你修复LVM中PV显示[unknown]的诡异问题

本文详细解析了Linux运维中LVM物理卷(PV)显示[unknown]的故障现象及修复方法。通过分析问题根源、提供标准修复流程和特殊场景处理方案,帮助运维人员快速解决VG容量异常、PV状态丢失等问题,并分享预防措施与最佳实践,确保LVM存储系统的稳定运行。

weixin_26869081的博客 348

C#+ArcEgine开发(3)属性表的各种操作(2)

继续上一篇----------------------------------------------------------------------------------------------------------三、删除字段这里只删除表里的字段,原始数据没有改变,图不会删去字段对应的图层 private void 删除选择ToolStripMenuItem_Click(object se...

小陆同学LLR的博客 966

2024年03月CCF-GESP编程能力等级认证Python编程五级真题解析

下面流程图在yr输入2024时,可以判定yr代表闰年,并输出 2月是29天 ,则图中菱形框中应该填入( )。 A. (yr % 400 == 0) or (yr % 4 == 0) B. ( yr % 400 == 0) or (yr % 4 == 0 and yr %100 != 0) C. ( yr % 400 == 0) and ( yr % 4 == 0) D. (yr % 400 == 0) and (yr % 4 == 0 and yr % 100 != 0)

人生就是一个不断学习的过程 746

目标检测: yolo26在RK3588上部署

YOLO26发布:端到端目标检测新突破 摘要:Ultralytics最新发布的YOLO26算法采用原生端到端设计,无需NMS后处理,显著提升推理效率。该模型基于三大核心原则: 简洁性:消除NMS步骤,实现直接预测 部署效率:简化集成流程,降低延迟 训练创新:引入MuSGD混合优化器,加速收敛 部署教程显示,YOLO26可适配RK3588等边缘设备,通过ONNX转换和RKNN工具链实现高效部署。其创新架构特别优化了分割、姿态估计等专业任务,标志着目标检测技术的重要革新。 (字数:149)

qianxun 1444

C#+ArcEgine开发(1)地图浏览小应用

最近做一个作业,之前没用过ArcEgine,就边学边做,就想着把做的过程包括成果写下来,相当于做个笔记吧。参考书目《ArcGIS Egine+C#入门经典》《ArcGIS Egine开发从入门到精通》还有网上搜集的各种资料(感谢前辈们的笔记,菜鸟真的是受益良多)---------------------------------------------------------------------...

小陆同学LLR的博客 1046

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C#+ArcEgine开发(2)添加shp和lyr文件

都是《ArcGIS Egine+C#入门经典》里的例子,可以找来看看---------------------------------------------------------------------------------------------------------------------------

小陆同学LLR的博客 2136

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C#+ArcEgine开发(4)三维分析

1、新建一个窗体文件主菜单栏有4个功能:数据加载、拉伸、地形渲染、坡度分析2、数据加载功能(1)导入DEM数据

小陆同学LLR的博客 3118

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

C#+ArcEgine开发---理论学习(2)

ArcEgine中的类库在ArcEgine开发中,为了更好管理这些COM对象,ESRI将这些COM对象放在不同的组件库中。物理上,它们被放在bin目录下的dll中,逻辑上被分散到不同的命名空间中。1、SystemSystem库是ArcGIS架构中最底层的库,库中定义了许多接口,它们可以由开发者来实现。AoInitializer对象在System中定义;所有开发者必须使用该对象在使用Egine功能的...

小陆同学LLR的博客 602

ArcEngine组件式开发技术

ArcEngine+C# TIN相关三维功能模块介绍(二) ——下拉框(ComboBox)颜色控件 作者:刘志远 这一篇介绍如何写一个单色和渐变色的颜色选择下拉框(ComboBox)控件。有些功能中,需要用户自定义选颜色时,一般只需调用Col...

weixin_33949359的博客 233

Arcengine调用GP服务

注需 2个引用的区别 D:\Program Files (x86)\ArcGIS\DeveloperKit10.1\DotNet\ESRI.ArcGIS.Geoprocessor.dll D:\Program Files (x86)\ArcGIS\DeveloperKit10.1\DotNet\ESRI.ArcGIS.Geoprocessing.dll 官网代码: Each geop...

weixin_34310785的博客 360

ArcEngine+PostgreSQL+Postgis With out ArcSDE(转载)

 转自:http://rocye.iteye.com/blog/1511112 ArcGis平台是一个价格相当高的商业平台,本来想通过ArcSDE进行开发,这样方便而且有保证。但是因为项目在初期阶段还未采购ArcGis平台,前期为了项目开发对于初学ArcEngine的偶,破解破的我头大,可以说费了九牛三虎之力。项目进行到数据处理阶段,前期的开发工作的数据源来自shp文件。现在需要用到数据库来提供...

weixin_34318956的博客 425

C#基于ArcGIS Engine写的要素图层工具类

用于从MapControl中获取可见图层、获取指定图层名等: using ESRI.ArcGIS.Carto; using ESRI.ArcGIS.Controls; using ESRI.ArcGIS.Geodatabase; using ESRI.ArcGIS.Geometry; using System.Collections.Generic; namespace XXXX { ...

a_dev的专栏 543

Tocc右键菜单的实现:属性表;移除图层;图层(不)可选;缩放至图层

Tocc右键菜单的实现 参考来源:《ArcGISEngine地理信息系统开发教程》 作者:牟乃夏编;王海银编;李丹编;高松峰编;戴洪磊编 出版社:测绘出版社 出版时间:2015年03月 光盘文件 首先一个下拉菜单包括tocc右键所要实现的功能 主窗体中变量定义 //TOC菜单 IFeatureLayer pTocFeatureLayer = null; //点击的要素图层 private FormAtrribute frmAttribute

weixin_44389786的博客 1823

c#中的属性

  在C#中我们可以很自由的访问共有字段,但有时我们可能需要某字段只能读或者写,或在改变字段值得时候做一些其他事情,显然这些仅仅依靠字段是无法实现的,于是便有了属性。   1、基本用法   c#中的属性由属性作用域中定义的get作用域(访问方法)和set作用域(访问方法)构成。 class Test { private int number; /...

545
上一篇: C#+ArcEgine开发(2)添加shp和lyr文件
下一篇: C#+ArcEgine开发----理论学习(1)
小陆同学LLR
博客等级 码龄10年 213粉丝 44原创
评论 7
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值