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()
{
    // 订阅 RowCreatedEvent
    Table 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()
{
    // 订阅 RowCreatedEvent
    Table 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()
{
    // 订阅 RowChangedEvent
    Table 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()
{
    // 订阅 RowChangedEvent
    Table 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()
{
    // 订阅适当表的 RowDeletedEvent
    Table 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.mfbz.cn/a/761206.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Vue-cli脚手架创建uni-app项目(Vue2版本)

文章目录 前言准备工作接下来创建我们的 uni-app 项目 前言 uni-app官方说除了HBuilderX可视化界面&#xff0c;也可以使用 cli 脚手架&#xff0c;可以通过 vue-cli 创建 uni-app 项目。 uni-app官网文档 准备工作 需要安装 node.js 与 vue-cli 脚手架 我是用的版本如下 no…

【Python】从基础到进阶(二):了解Python语言基础以及数据类型转换、基础输入输出

&#x1f525; 个人主页&#xff1a;空白诗 文章目录 一、引言二、基本数据类型转换1. 隐式转换2. 显式转换 三、基本输入输出1. 输入&#xff08;input&#xff09;2. 输出&#xff08;print&#xff09;3. 案例&#xff1a;输入姓名、年龄、身高以及体重&#xff0c;计算BMI指…

ICMAN触摸芯片之隔空感应

ICMAN触摸芯片之隔空感应 ICMAN触摸芯片满足工业级设计标准&#xff0c; 可过CS10V&#xff0c;ESD8kV&#xff0c;EFT4kV测试&#xff0c; 有超强稳定性和抗干扰能力 &#xff0c; 多用在普通触摸按键开关、大金属触摸及高灵敏度应用场合。 可根据实际应用&#xff0c;有低…

MWCSH 2024丨美格智能亮相上海世界移动通信大会,加速5G+AIoT应用进程

6月26日—28日全球通信领域最具规模和影响力的通信盛事—2024MWC上海世界移动通信大会在上海新国际博览中心隆重举行。MWC上海是亚洲连接生态系统的风向标&#xff0c;本届大会以“未来先行&#xff08;Future First&#xff09;”为主题&#xff0c;聚焦“超越5G”“人工智能经…

牛客小白月赛97 (个人题解)(待补完)

前言&#xff1a; 前天晚上写的一场牛客上比赛&#xff0c;虽然只写出了三道&#xff0c;但比起之前的成绩感觉自己明显有了一点进步了&#xff0c;继续努力吧&#xff0c; 正文&#xff1a; 链接&#xff1a;牛客小白月赛97_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞…

短信接口API的选择因素?有哪些使用方法?

短信接口API的集成难点是什么&#xff1f;如何保障API安全性&#xff1f; 短信接口API已经成为许多企业和开发者的关键工具&#xff0c;市场上有许多不同的短信接口API可供选择&#xff0c;这使得选择适合的API变得尤为重要。AoKSend将探讨在选择短信接口API时需要考虑的主要因…

vscode的一些使用问题

vscode使用技巧 1、快捷键&#xff08;1&#xff09;打开命令面板&#xff08;2&#xff09;注释&#xff08;3&#xff09;删除行&#xff08;4&#xff09;上下移动光标&#xff08;5&#xff09;光标回退&#xff08;6&#xff09;复制行&#xff08;7&#xff09;插入空白行…

联邦的基础配置

一、联邦的定义 联邦&#xff1a;在AS内部部署全互联的IBGP对等体可以很好解决IBGP路由传递的问题&#xff0c;但是扩展性低&#xff0c;大型网络中会带来沉重负担&#xff0c;针对此问题可以用路由反射器解决&#xff0c;也可以利用联邦解决&#xff0c;联邦也被称为联盟。大…

干货分享:Spring中经常使用的工具类(提示开发效率)

环境&#xff1a;Spring5.3…30 1、资源工具类 ResourceUtils将资源位置解析为文件系统中的文件的实用方法。 读取classpath下文件 File file ResourceUtils.getFile(ResourceUtils.CLASSPATH_URL_PREFIX "logback.xml") ; // ...读取文件系统文件 file Resou…

ABAP 新语法-ITAB[ idx ]、ITAB[ key ]

这段ABAP代码主要演示了使用新的ABAP语法内表表达式的用法&#xff0c;其中核心点如下&#xff1a; 索引和关键字读取&#xff1a; 使用gt_student[1]进行索引读取&#xff0c;获取内表的第一个元素。使用gt_student[id 0000000005 age 15]进行关键字读取&#xff0c;根据指…

电子战学习笔记01:电子战概论

0、写在文前 本人在学习电子战相关理论知识时&#xff0c;一直感觉无从下手&#xff0c;之后在老师的推荐下购买了《EW101&#xff1a;电子战基础》纸质书籍学习&#xff0c;所以将自己的学习笔记在CSDN上记录一下&#xff0c;也供有需要的同学参考。 1、电子战定义 电子战&…

惠海100V 15A HC070N10L TO-252封装 N沟道MOS管 打火机/BMS电源板应用

MOS管的工作原理是基于在P型半导体与N型半导体之间形成的PN结&#xff0c;通过改变栅极电压来调整沟道内载流子的数量&#xff0c;从而改变沟道电阻和源极与漏极之间的电流大小。由于MOS管具有输入电阻高、噪声小、功耗低等优点&#xff0c;它们在大规模和超大规模集成电路中得…

ESP32-C3(基本信息)

ESP32-C3 是一款低功耗、高集成度的 MCU 系统级芯片 (SoC)&#xff0c;它集成了 2.4 GHz Wi-Fi 和低功耗蓝牙 (Bluetooth LE) 无线通信功能&#xff0c;并拥有丰富的外设接口和先进的电源管理机制。 主要特性&#xff1a; 无线通信&#xff1a; 支持 2.4 GHz Wi-Fi (802.11b/…

AI音乐革命:创新的门槛降低与产业未来的挑战

文章目录 每日一句正能量前言整体介绍人机合作AI在音乐创作中的辅助作用人机共同创作的模式实现人机共同创作的可能性伦理和法律考量 伦理道德AI与人类创造力的关系技术发展与人类创造力的平衡社会和文化影响结论 后记AI与音乐的未来交响创新的双刃剑版权与伦理的探讨人机合作的…

GaussDB关键技术原理:高性能(三)

GaussDB关键技术原理&#xff1a;高性能&#xff08;二&#xff09;从查询处理综述对GaussDB的高性能技术进行了解读&#xff0c;本篇将从查询重写RBO、物理优化CBO、分布式优化器、布式执行框架、轻量全局事务管理GTM-lite等五方面对高性能关键技术进行分享。 目录 3 高性能…

深入理解Java核心技术模块化局部变量类型推断

本人详解 作者:王文峰,参加过 CSDN 2020年度博客之星,《Java王大师王天师》 公众号:JAVA开发王大师,专注于天道酬勤的 Java 开发问题中国国学、传统文化和代码爱好者的程序人生,期待你的关注和支持!本人外号:神秘小峯 山峯 转载说明:务必注明来源(注明:作者:王文峰…

【C语言】23.文件操作

由于要对数据进行持久化保存&#xff0c;我们就有了文件。 一、程序文件与数据文件 磁盘&#xff08;硬盘&#xff09;上的文件是文件。 但是在程序设计中&#xff0c;我们⼀般谈的文件有两种&#xff1a;程序文件、数据文件&#xff08;从文件功能的角度来分类的&#xff09…

pdf压缩,pdf压缩在线网页版,在线压缩pdf网站

在数字化时代&#xff0c;pdf文件已经成为我们工作、学习和生活中不可或缺的一部分。然而&#xff0c;pdf文件往往体积庞大&#xff0c;传输效率低下&#xff0c;还占用大量存储空间。如何在不影响文件质量的前提下&#xff0c;减小pdf文件的大小呢&#xff1f;今天&#xff0c…

线程安全问题(二)——死锁

死锁 前言可重入锁逻辑 两个线程两把锁&#xff08;死锁&#xff09;死锁的特点多个线程多把锁&#xff08;哲学家就餐问题&#xff09;总结 前言 在前面的文章中&#xff0c;介绍了锁的基本使用方式——锁 在上一篇文章中&#xff0c;通过synchronized关键字进行加锁操作&am…

在Stimulsoft 报告中连接来自 MySQL 的数据

Stimulsoft Ultimate &#xff08;原Stimulsoft Reports.Ultimate&#xff09;是用于创建报表和仪表板的通用工具集。该产品包括用于WinForms、ASP.NET、.NET Core、JavaScript、WPF、PHP、Java和其他环境的完整工具集。无需比较产品功能&#xff0c;Stimulsoft Ultimate包含了…