C#进行Visio二次开发之设备状态跟踪

简介:
明察秋毫,很多情况下是非常需要的,例如,如果我们完善了一套系统,能够将四川赈灾的款项的筹集、采购、分发等步骤都能明察秋毫,相信整个世界会安静很多。
同样,对于一个使用Visio进行二次开发的程序来说,背后你需要知道用户增加了那些设备,删除了那些设备,修改了那些设备,这样你才能对整个系统的数据进行有效的控制,否则“赈灾”款项就可能丢失了,呵呵。
那我们应该如何做才能有效的处理这些事件,达到对设备的变更明察秋毫呢?
我前面介绍了一篇文章《 C#进行Visio开发的事件处理  》,其中也介绍了各种事件侦听,我们要对设备进行跟踪的话,基本上只需要侦听这几个事件,并对之进行处理即可。
None.gif             const  string sink =  "";
None.gif            Event newEvent =  null;
None.gif
None.gif            EventList applicationEvents = eventApplication.EventList;
None.gif            EventList documentEvents = eventDocument.EventList;
None.gif
None.gif            newEvent = documentEvents.AddAdvise(
None.gif                ( unchecked(( short)VisEventCodes.visEvtAdd) + ( short)VisEventCodes.visEvtShape),
None.gif                (IVisEventProc) this, sink,  " ShapeAdd ");
None.gif
None.gif            newEvent = documentEvents.AddAdvise(
None.gif                ( short)VisEventCodes.visEvtDel + ( short)VisEventCodes.visEvtShape,
None.gif                (IVisEventProc) this, sink,  " ShapeDelete ");
None.gif
None.gif              newEvent = documentEvents.AddAdvise(
None.gif                ( short)VisEventCodes.visEvtMod + ( short)VisEventCodes.visEvtCell,
None.gif                (IVisEventProc) this, sink,  " CellChanged ");
None.gif
None.gif         object IVisEventProc.VisEventProc( short eventCode,  object source,  int eventId,
None.gif             int eventSequenceNumber,  object subject,  object moreInfo)
ExpandedBlockStart.gif         {
InBlock.gif        dot.gifdot.gifdot.gifdot.gifdot.gif.
InBlock.gif            switch (eventCode)
ExpandedSubBlockStart.gif            {
InBlock.gif                case (short)VisEventCodes.visEvtShape + unchecked((short)VisEventCodes.visEvtAdd):
InBlock.gif                    eventShape = (Shape)subject;
InBlock.gif                    handleShapeAdd(eventShape);
InBlock.gif                    break;
InBlock.gif
InBlock.gif                case (short)VisEventCodes.visEvtDel + (short)VisEventCodes.visEvtShape:
InBlock.gif                    eventShape = (Shape)subject;
InBlock.gif                    handleShapeDelete(eventShape);
InBlock.gif                    break;
InBlock.gif
InBlock.gif                case (short)VisEventCodes.visEvtCell + (short)VisEventCodes.visEvtMod:
InBlock.gif                    Visio.Cell cell = (Cell)subject;
InBlock.gif                    if (cell.Name.IndexOf("Prop") >= 0)//限制只执行自定义事件一次
ExpandedSubBlockStart.gif
                    {
InBlock.gif                        eventShape = cell.Shape;
InBlock.gif                        handleCellModify(eventShape);
ExpandedSubBlockEnd.gif                    }

InBlock.gif                    break;
InBlock.gif
InBlock.gif                default:
InBlock.gif                    break;
ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            return result;
ExpandedBlockEnd.gif        }

以上是对几个特别事件的侦听,我们要实现设备的跟踪,需要在这几个事件中处理相关的设备信息。为了跟踪好设备的相关信息,我们需要定义一个实体类ShapeLogInfo类放置相关的设备信息,如Shape的GUID,Shape的ID,设备状态(添加、修改、删除),Shape的Name,还有就是我们自定义的一个属性“设备类型”。

ExpandedBlockStart.gif         /// <summary>
InBlock.gif        
/// 形状的类型,即设备类型
ExpandedBlockEnd.gif        
/// </summary>

None.gif         public  string ShapeType
None.gif
ExpandedBlockStart.gif         /// <summary>
InBlock.gif        
/// 形状ID
ExpandedBlockEnd.gif        
/// </summary>

None.gif         public  string ShapeID
None.gif
ExpandedBlockStart.gif         /// <summary>
InBlock.gif        
/// 形状的GUID
ExpandedBlockEnd.gif        
/// </summary>

None.gif         public  string ShapeGuid
None.gif
ExpandedBlockStart.gif         /// <summary>
InBlock.gif        
/// 形状的状态:新增、编辑、删除
ExpandedBlockEnd.gif        
/// </summary>

None.gif         public ShapeStatus ShapeStatus
None.gif
ExpandedBlockStart.gif         /// <summary>
InBlock.gif        
/// 形状名称
ExpandedBlockEnd.gif        
/// </summary>

None.gif         public  string ShapeName

为了更好的管理ShapeLogInfo的相关信息,我们把相同设备类型(ShapeType)的放到一起管理,于是,我们再创建一个ShapeTypeLogInfo类来装载相关的日志信息,具体如下:

ExpandedBlockStart.gif         /// <summary>
InBlock.gif        
/// 形状类型
ExpandedBlockEnd.gif        
/// </summary>

None.gif     public  string ShapeType
None.gif
ExpandedBlockStart.gif         /// <summary>
InBlock.gif        
/// 形状类型对应的数据库表名称
ExpandedBlockEnd.gif        
/// </summary>

None.gif         public  string ShapeTableName
None.gif
ExpandedBlockStart.gif         /// <summary>
InBlock.gif        
/// 该形状类型对应的形状日志对象集合
ExpandedBlockEnd.gif        
/// </summary>

None.gif         public Dictionary< string, ShapeLogInfo> ShapeColloction

为了判断是否有相应的ShapeTypeLogInfo和ShapeLogInfo,需要定义几个函数用来维护相关的集合信息,如下所示:

ExpandedBlockStart.gif         /// <summary>
InBlock.gif        
/// 获取形状对应的类型,如果没有则创建
ExpandedBlockEnd.gif        
/// </summary>

None.gif         private ShapeTypeLogInfo GetShapeType(ShapeLogInfo shape)
None.gif
ExpandedBlockStart.gif         /// <summary>
InBlock.gif        
/// 如果集合中有,修改状态;否则添加一个新的
ExpandedBlockEnd.gif        
/// </summary>

None.gif         public  void AddLog(ShapeLogInfo shapeLogInfo)
None.gif
ExpandedBlockStart.gif         /// <summary>
InBlock.gif        
/// 判断指定的形状是否是在集合中存在
ExpandedBlockEnd.gif        
/// </summary>

None.gif         public  bool IsNewShape(ShapeLogInfo shape)
None.gif
None.gif
ExpandedBlockStart.gif         /// <summary>
InBlock.gif        
/// 取当前设备在集合中存储的ShapeLog对象
ExpandedBlockEnd.gif        
/// </summary>

None.gif         public ShapeLogInfo GetShape( string shapeType,  string shapeId)

完成这些函数后,最后需要做的就是在添加、删除、修改Shape的侦听事件中加入相关的日志就可以了,如在删除设备的时候,我们是这样记录相关信息的

None.gif private  void visioEventSink_OnShapeDelete( object sender, EventArgs e)
ExpandedBlockStart.gif {
InBlock.gif            Shape shape = (Shape)sender;
InBlock.gif            string strDeviceType = string.Empty;
InBlock.gif            string strDeviceName = string.Empty;
InBlock.gif            string strDeviceID = string.Empty;
InBlock.gif
InBlock.gif            strDeviceType = VisioUtility.GetShapeCellValue(shape, "设备类型");
InBlock.gif            strDeviceID = VisioUtility.GetShapeCellValue(shape, "GUID");
InBlock.gif
InBlock.gif
InBlock.gif            ShapeLogInfo logInfo = new ShapeLogInfo();
InBlock.gif            logInfo.ShapeType = strDeviceType;
InBlock.gif            logInfo.ShapeID = shape.NameID;
InBlock.gif            logInfo.ShapeName = VisioUtility.GetShapeCellValue(shape, "名称");
InBlock.gif
InBlock.gif            if (shape.Application.IsUndoingOrRedoing)
ExpandedSubBlockStart.gif            {
InBlock.gif                ShapeLogInfo info = Portal.gc.gOperationLog.GetShape(strDeviceType, shape.NameID);
InBlock.gif                if (info != null)
ExpandedSubBlockStart.gif                {
InBlock.gif                    strDeviceID = info.ShapeGuid;
ExpandedSubBlockEnd.gif                }

ExpandedSubBlockEnd.gif            }

InBlock.gif
InBlock.gif            logInfo.ShapeGuid = strDeviceID;
InBlock.gif            logInfo.ShapeStatus = ShapeStatus.DeleteShape;
InBlock.gif            Portal.gc.gOperationLog.AddLog(logInfo);
ExpandedBlockEnd.gif}

其中if (shape.Application.IsUndoingOrRedoing)是为了判断该操作是否为Undo或者Redo导致的操作,如果是,我们获取它之前Shape的GUID即可。

记录了设备的这些修改信息,我们就可以在保存数据的时候,根据这些信息移除相关的关系,添加或者删除相关的设备信息了,而且这些信息,对于我们记录用户的图纸修订记录也是必须要做的事情。

本文转自博客园伍华聪的博客,原文链接:C#进行Visio二次开发之设备状态跟踪,如需转载请自行联系原博主。



 

目录
相关文章
|
1月前
|
C#
24. C# 编程:用户设定敌人初始血值的实现
24. C# 编程:用户设定敌人初始血值的实现
22 0
|
2月前
|
SQL 数据库连接 应用服务中间件
C#WinForm基础编程(三)
C#WinForm基础编程
77 0
|
2月前
C#WinForm基础编程(二)
C#WinForm基础编程
58 0
|
2月前
|
C# 数据安全/隐私保护
C#WinForm基础编程(一)
C#WinForm基础编程
62 0
|
4月前
|
数据采集 前端开发 C#
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
Twitter是全球最大的社交媒体平台之一,包含丰富的音频资源。用户可以在Twitter上发布、转发、评论和收听各种音频内容,如音乐、播客、新闻、故事等,直接从Twitter抓取音频数据并非易事,尤其是在考虑到可能的封锁和反爬虫机制。Twitter会对频繁访问的IP地址进行限制或封禁,以防止恶意爬虫的行为。因此,我们需要使用一些技术手段来规避这些障碍,确保稳定而高效的数据访问。
C#编程艺术:Fizzler库助您高效爬取www.twitter.com音频
|
3月前
|
程序员 C#
深入理解 C# 编程:枚举、文件处理、异常处理和数字相加
枚举是一个特殊的“类”,表示一组常量(不可更改/只读变量)。 要创建枚举,请使用 enum 关键字(而不是 class 或 interface),并用逗号分隔枚举项:
38 0
|
5天前
|
存储 安全 网络安全
C#编程的安全性与加密技术
【4月更文挑战第21天】C#在.NET框架支持下,以其面向对象和高级特性成为安全软件开发的利器。本文探讨C#在安全加密领域的应用,包括使用System.Security.Cryptography库实现加密算法,利用SSL/TLS保障网络传输安全,进行身份验证,并强调编写安全代码的重要性。实际案例涵盖在线支付、企业应用和文件加密,展示了C#在应对安全挑战的同时,不断拓展其在该领域的潜力和未来前景。
|
5天前
|
程序员 C#
C#编程中的面向对象编程思想
【4月更文挑战第21天】本文探讨了C#中的面向对象编程,包括类、对象、封装、继承和多态。类是对象的抽象,定义属性和行为;对象是类的实例。封装隐藏内部细节,只暴露必要接口。继承允许类复用和扩展属性与行为,而多态使不同类的对象能通过相同接口调用方法。C#通过访问修饰符实现封装,使用虚方法和抽象方法实现多态。理解并应用这些概念,能提升代码的清晰度和可扩展性,助你成为更好的C#程序员。
|
6天前
|
IDE 程序员 C#
C#编程入门:从零开始的旅程
【4月更文挑战第20天】本文引导初学者入门C#编程,从环境搭建开始,推荐使用Visual Studio Community版作为IDE。接着,通过编写&quot;Hello, World!&quot;程序,介绍基本语法,包括数据类型、运算符和表达式。文章还涉及控制结构、函数和方法,以及面向对象编程概念。通过学习,读者将对C#有初步了解,并激发进一步探索编程世界的兴趣。