ArcGIS Pro SDK (七)编辑 4 行事件

ArcGIS Pro SDK (七)编辑 4 行事件

目录

  • ArcGIS Pro SDK (七)编辑 4 行事件
    • 1 订阅行事件
    • 2 在行事件中的映射中的单独表中创建记录
    • 3 在行事件中的单独表中创建记录
    • 4 修改行事件中的记录 - 使用 Row.Store
    • 5 修改行事件中的记录 - 使用 EditOperation.Modify
    • 6 确定编辑时几何图形是否更改
    • 7 取消删除

环境:Visual Studio 2022 + .NET6 + ArcGIS Pro SDK 3.0

1 订阅行事件

protected void SubscribeRowEvent()
{QueuedTask.Run(() =>{//监听图层的行事件var featLayer = MapView.Active.GetSelectedLayers().First() as FeatureLayer;var layerTable = featLayer.GetTable();//订阅行事件var rowCreateToken = RowCreatedEvent.Subscribe(OnRowCreated, layerTable);var rowChangeToken = RowChangedEvent.Subscribe(OnRowChanged, layerTable);var rowDeleteToken = RowDeletedEvent.Subscribe(OnRowDeleted, layerTable);});
}protected void OnRowCreated(RowChangedEventArgs args)
{
}protected void OnRowChanged(RowChangedEventArgs args)
{
}protected void OnRowDeleted(RowChangedEventArgs args)
{
}

2 在行事件中的映射中的单独表中创建记录

// 使用 RowChangedEventArgs 中的 EditOperation 来追加要执行的操作。
//  你的操作将成为操作的一部分,并合并到撤消堆栈中的一个项目中。private void HookRowCreatedEvent()
{// 订阅 RowCreatedEventTable table = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault().GetTable();RowCreatedEvent.Subscribe(MyRowCreatedEvent, table);
}private void MyRowCreatedEvent(RowChangedEventArgs args)
{// RowEvent 回调总是被 QueuedTask 调用,因此不需要// 在 QueuedTask.Run lambda 中包装代码。// 获取编辑操作var parentEditOp = args.Operation;// 设置一些属性var attribs = new Dictionary<string, object> { };attribs.Add("Layer", "Parcels");attribs.Add("Description", "OID: " + args.Row.GetObjectID().ToString() + " " + DateTime.Now.ToShortTimeString());//在审计表中创建一条记录var sTable = MapView.Active.Map.FindStandaloneTables("EditHistory").First();var table = sTable.GetTable();parentEditOp.Create(table, attribs);
}

3 在行事件中的单独表中创建记录

// 使用 RowChangedEventArgs 中的 EditOperation 来追加要执行的操作。
//  你的操作将成为操作的一部分,并合并到撤消堆栈中的一个项目中。private void HookCreatedEvent()
{// 订阅 RowCreatedEventTable table = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault().GetTable();RowCreatedEvent.Subscribe(OnRowCreatedEvent, table);
}private void OnRowCreatedEvent(RowChangedEventArgs args)
{// RowEvent 回调总是被 QueuedTask 调用,因此不需要// 在 QueuedTask.Run lambda 中包装代码。// 当创建行时更新不在映射中的单独表// 必须使用 ArcGIS.Core.Data API 来编辑表。不要在 RowEvent 回调中使用新的编辑操作try{// 获取编辑操作var parentEditOp = args.Operation;// 设置一些属性var attribs = new Dictionary<string, object> { };attribs.Add("Description", "OID: " + args.Row.GetObjectID().ToString() + " " + DateTime.Now.ToShortTimeString());// 使用新要素的信息更新 Notes 表using (var geoDatabase = new Geodatabase(new FileGeodatabaseConnectionPath(new Uri(Project.Current.DefaultGeodatabasePath)))){using (var table = geoDatabase.OpenDataset<Table>("Notes")){parentEditOp.Create(table, attribs);}}}catch (Exception e){MessageBox.Show($@"Error in OnRowCreated for OID: {args.Row.GetObjectID()} : {e.ToString()}");}
}

4 修改行事件中的记录 - 使用 Row.Store

private void HookRowChangedEvent()
{// 订阅 RowChangedEventTable table = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault().GetTable();RowChangedEvent.Subscribe(OnRowChangedEvent, table);
}private Guid _currentRowChangedGuid = Guid.Empty;
protected void OnRowChangedEvent(RowChangedEventArgs args)
{// RowEvent 回调总是被 QueuedTask 调用,因此不需要// 在 QueuedTask.Run lambda 中包装代码。var row = args.Row;// 检查重入(仅在调用 row.Store 时)if (_currentRowChangedGuid == args.Guid)return;var fldIdx = row.FindField("POLICE_DISTRICT");if (fldIdx != -1){// 验证对“police district”的任何更改// 如果字段验证失败则取消编辑if (row.HasValueChanged(fldIdx)){// 使用无效的区(5)取消编辑var value = row["POLICE_DISTRICT"].ToString();if (value == "5"){// 使用无效的“police district”值取消编辑args.CancelEdit($"Police district {row["POLICE_DISTRICT"]} is invalid");}}// 更新描述字段row["Description"] = "Row Changed";// 这次更新会导致发生另一个 OnRowChanged 事件// 跟踪行 guid 以避免递归_currentRowChangedGuid = args.Guid;row.Store();_currentRowChangedGuid = Guid.Empty;}
}

5 修改行事件中的记录 - 使用 EditOperation.Modify

private void HookChangedEvent()
{// 订阅 RowChangedEventTable table = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault().GetTable();RowChangedEvent.Subscribe(MyRowChangedEvent, table);
}private void MyRowChangedEvent(RowChangedEventArgs args)
{// RowEvent 回调总是被 QueuedTask 调用,因此不需要// 在 QueuedTask.Run lambda 中包装代码。// 修改已创建行上的字段示例var parentEditOp = args.Operation;// 避免递归if (_lastEdit != args.Guid){// 在更改时更新字段parentEditOp.Modify(args.Row, "ZONING", "New");_lastEdit = args.Guid;}
}

6 确定编辑时几何图形是否更改

private static FeatureLayer featureLayer;
private static void DetermineGeometryChange()
{featureLayer = MapView.Active?.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault();if (featureLayer == null)return;QueuedTask.Run(() =>{//监听行更改事件ArcGIS.Desktop.Editing.Events.RowChangedEvent.Subscribe(OnRowChangedEvent2, featureLayer.GetTable());});
}
private static void OnRowChangedEvent2(RowChangedEventArgs args)
{// RowEvent 回调总是被 QueuedTask 调用,因此不需要// 在 QueuedTask.Run lambda 中包装代码。//获取图层的定义var lyrDefn = featureLayer.GetFeatureClass().GetDefinition();//获取要素类的形状字段string shapeField = lyrDefn.GetShapeField();//形状字段的索引var shapeIndex = lyrDefn.FindField(shapeField);//修改行的原始几何var geomOrig = args.Row.GetOriginalValue(shapeIndex) as Geometry;//修改行的新几何var geomNew = args.Row[shapeIndex] as Geometry;//比较两者bool shapeChanged = geomOrig.IsEqual(geomNew);
}

7 取消删除

public static void StopADelete()
{// 订阅适当表的 RowDeletedEventTable table = MapView.Active.Map.GetLayersAsFlattenedList().OfType<FeatureLayer>().FirstOrDefault().GetTable();RowDeletedEvent.Subscribe(OnRowDeletedEvent, table);
}private static void OnRowDeletedEvent(RowChangedEventArgs args)
{// RowEvent 回调总是被 QueuedTask 调用,因此不需要// 在 QueuedTask.Run lambda 中包装代码。var row = args.Row;// 如果要素位于 5 区,则取消删除var fldIdx = row.FindField("POLICE_DISTRICT");if (fldIdx != -1){var value = row[fldIdx].ToString();if (value == "5"){//带对话框取消// 注意 - 无法取消托管和标准要素服务上的要素编辑。args.CancelEdit("Delete Event\nAre you sure", true);// 或不带对话框取消// args.CancelEdit();}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/864653.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

`THREE.LineBasicMaterial` 是 three.js 中用来创建用于绘制线条的基本材质。

demo案例 THREE.LineBasicMaterial 是 three.js 中用来创建用于绘制线条的基本材质。以下是它的入参、出参、方法和属性的详细说明。 入参 (Constructor Parameters) THREE.LineBasicMaterial 构造函数可以接收一个包含多个属性的对象。常用属性如下&#xff1a; const ma…

第一后裔快速领取掉宝奖励礼包教程

7月2日第一后裔在steam正式上线&#xff0c;全新刷宝射击mmo玩法&#xff0c;角色的招式非常新颖 &#xff0c;画面冲击感十足&#xff0c;而且游戏人物的自定义功能非常丰富&#xff0c;超级细节真实的人物建模&#xff0c;加上超带感的服装自定义系统&#xff0c;让你能玩一整…

在CentOS7云服务器下搭建MySQL网络服务详细教程

目录 0.说明 1.卸载不要的环境 1.1查看当前环境存在的服务mysql或者mariadb 1.2卸载不要的环境 1.2.1先关闭相关的服务 1.2.2查询曾经下载的安装包 1.2.3卸载安装包 1.2.4检查是否卸载干净 2.配置MySQLyum源 2.1获取mysql关外yum源 2.2 查看当前系统结合系统配置yum…

探索中尺度气象学的奥秘:精准预测,守护每一片蓝天

探索中尺度气象学的奥秘&#xff1a;精准预测&#xff0c;守护每一片蓝天 在浩瀚的自然界中&#xff0c;天气变化无常&#xff0c;既孕育着生命的奇迹&#xff0c;也潜藏着不可预测的威胁。中尺度气象学&#xff0c;作为大气科学中的一个重要分支&#xff0c;专注于研究水平尺…

优思学院|今时今日还有谁想干供应商质量工程师(SQE)?

引言&#xff1a;SQE的迷思 供应商质量工程师&#xff08;SQE&#xff09;这个职位&#xff0c;听起来颇具技术性和专业性&#xff0c;但在职场中&#xff0c;却常常被视为一个既有挑战又不容易受到欢迎的岗位。SQE究竟是一个怎样的角色&#xff1f;谁愿意选择这个职业&#x…

为什么127.0.0.1和localhost之间算跨域?

原文&#xff1a;https://mp.weixin.qq.com/s/4zJBMNEntwjqAfN6A6diUA 什么是同源策略、跨域 跨域问题是指在浏览器中&#xff0c;当一个网页向不同域名、不同端口或不同协议的资源发起请求时&#xff0c;会受到限制。这是由浏览器的**同源策略&#xff08;Same-Origin Policy…

wps 表格如何实现vlookup高级模糊搜索

一、VLOOKUP 模糊搜索 在 WPS 表格中&#xff0c;可以通过使用 VLOOKUP 函数和通配符来实现高级模糊搜索。这里有一个具体的示例来帮助你理解如何进行这些操作。 示例&#xff1a;实现 VLOOKUP 高级模糊搜索 假设我们有以下数据集&#xff1a; AB产品编号产品名称001苹果00…

uniapp实现可拖动悬浮按钮(最新版2024-7月)

此章主要介绍如何使用uniapp跨平台开发&#xff0c;实现悬浮按钮&#xff0c;移动端经常会有所这样的需求&#xff0c;那么功能如下&#xff1a; 1.圆圈悬浮球&#xff0c;上下左右靠边显示 2.可以界面任何拖动&#xff0c;不会超出界面 3.单击悬浮球的点击事件 效果&#xf…

Ubuntu 22.04上编译安装c++ spdlog library

Very fast, header-only/compiled, C logging library. 请以root身份或sudo执行。 1. 安装必需的依赖项&#xff1a; sudo apt-get update sudo apt-get install git g cmake 2. 克隆 spdlog 仓库&#xff1a; cd /opt git clone https://github.com/gabime/spdlog.git …

Resilience4j之RateLimiter和常见限流算法总结

官网地址&#xff1a;https://resilience4j.readme.io/docs/ratelimiter 中文文档&#xff1a;https://resilience4j.readme.io/docs/ratelimiter 【1】概述 Resilience4j提供了一个限流器&#xff0c;它将从epoch开始的所有纳秒划分为多个周期。每个周期的持续时间RateLimi…

【opencv - C++ - Ubuntu】putText 显示中文最快方法

话不多说&#xff0c;直接上代码 #include <iostream> #include <opencv2/opencv.hpp> #include <opencv2/freetype.hpp>using namespace std; using namespace cv;int main(void) {Mat image(1000, 1800, CV_8UC3, Scalar(200,162,33));Ptr<freetype::F…

银行卡二、三、四要素验证是什么?有什么意义?

银行卡的二、三、四要素验证是银行及金融机构为了确保交易的真实性和安全性&#xff0c;对用户身份进行验证的一系列手段。以下是对这些要素的清晰归纳&#xff1a; 一、银行卡二要素验证 银行卡二要素验证通常包含以下两种组合方式&#xff1a; 姓名卡号&#xff1a;验证用户…

单细胞水平看生存分析相关基因

技能树学徒作业 针对每个癌症的全部基因批量了做了单基因的cox分析&#xff0c;挑选统计学显著的去对应的癌症去打分&#xff0c;看看是否有单细胞亚群特异性。 这题比较常规&#xff0c;但是可以过一遍基础分析的流程。 选择了GSE38832芯片数据用于分析得到cox/logrank显著…

生物墨水与生物打印:一场生物科技的革新?

挤出生物打印 挤出生物打印原理 挤出生物打印利用机械力将生物墨水或生物材料溶液挤出&#xff0c;形成连续的丝状结构&#xff0c;并逐层堆叠构建出三维结构。根据所使用的机械力&#xff0c;挤出生物打印可分为三种类型&#xff1a; 气动式: 利用压缩空气驱动生物墨水或生…

Amazon Bedrock 实践 | 动手玩转 Claude 3

生成式 AI 和大模型在 2024 年已经进入落地实践阶段。因此&#xff0c;围绕开发者在生成式应用程序开发中的主要痛点和需求&#xff0c;我们组织了这个 “Amazon Bedrock 实践” 的系列&#xff0c;希望可以帮助开发者高效地上手生成式 AI 和大模型的应用开发&#xff0c;本篇为…

android super.img解包

一、lpunpack工具编译 mmm system/extras/partition_tools/二、稀疏镜像到非稀疏镜像转换 simg2img super.img super_unsparse.img三、super.img解包 lpunpack super_unsparse.img output 四、拆包结果 ls -l -rw-r--r-- 1 rdx rdx-user size Jan 1 14:36 product_a.img -r…

SMS群发信息API接口安全性有哪些保障方法?

SMS群发信息API接口支持哪些格式&#xff1f;如何使用API接口&#xff1f; SMS群发信息API接口被广泛应用于企业营销、客户服务、身份验证等多个领域。确保SMS群发信息API接口的安全性&#xff0c;已成为企业和开发者们必须重视的问题。AoKSend将探讨几种保障SMS群发信息API接…

GeoServer改造Springboot源码十(样式管理设计)

GeoServer改造Springboot源码一&#xff08;公共部分&#xff09; GeoServer改造Springboot源码二&#xff08;数据源管理设计&#xff09; GeoServer改造Springboot源码三&#xff08;数据源管理代码&#xff09; GeoServer改造Springboot源码四&#xff08;图层管理设计&a…

SQLServer中的函数

一.函数 函数调用格式&#xff1a; select 表名.该表中创建的函数 1.系统函数 系统中自带的函数&#xff0c;比如聚合函数&#xff08;sum等等&#xff09; 2.自定义函数 &#xff08;1&#xff09;.标量值函数&#xff08;只返回单个值&#xff09; 举例&#xff1a;我们…

CNN的小体验

用的pytorch。 训练代码cnn.py&#xff1a; import torch import torch.nn as nn import torch.optim as optim import torchvision import torchvision.transforms as transforms import torch.nn.functional as F# 定义超参数 num_epochs 10 batch_size 100 learning_rat…