明察秋毫,很多情况下是非常需要的,例如,如果我们完善了一套系统,能够将四川赈灾的款项的筹集、采购、分发等步骤都能明察秋毫,相信整个世界会安静很多。
同样,对于一个使用Visio进行二次开发的程序来说,背后你需要知道用户增加了那些设备,删除了那些设备,修改了那些设备,这样你才能对整个系统的数据进行有效的控制,否则“赈灾”款项就可能丢失了,呵呵。
那我们应该如何做才能有效的处理这些事件,达到对设备的变更明察秋毫呢?
我前面介绍了一篇文章《C#进行Visio开发的事件处理 》,其中也介绍了各种事件侦听,我们要对设备进行跟踪的话,基本上只需要侦听这几个事件,并对之进行处理即可。
明察秋毫,很多情况下是非常需要的,例如,如果我们完善了一套系统,能够将四川赈灾的款项的筹集、采购、分发等步骤都能明察秋毫,相信整个世界会安静很多。
同样,对于一个使用Visio进行二次开发的程序来说,背后你需要知道用户增加了那些设备,删除了那些设备,修改了那些设备,这样你才能对整个系统的数据进行有效的控制,否则“赈灾”款项就可能丢失了,呵呵。
那我们应该如何做才能有效的处理这些事件,达到对设备的变更明察秋毫呢?
我前面介绍了一篇文章《
C#进行Visio开发的事件处理 》,其中也介绍了各种事件侦听,我们要对设备进行跟踪的话,基本上只需要侦听这几个事件,并对之进行处理即可。
const string sink = "";
Event newEvent = null;

EventList applicationEvents = eventApplication.EventList;
EventList documentEvents = eventDocument.EventList;

newEvent = documentEvents.AddAdvise(
(unchecked((short)VisEventCodes.visEvtAdd) + (short)VisEventCodes.visEvtShape),
(IVisEventProc)this, sink, "ShapeAdd");

newEvent = documentEvents.AddAdvise(
(short)VisEventCodes.visEvtDel + (short)VisEventCodes.visEvtShape,
(IVisEventProc)this, sink, "ShapeDelete");

newEvent = documentEvents.AddAdvise(
(short)VisEventCodes.visEvtMod + (short)VisEventCodes.visEvtCell,
(IVisEventProc)this, sink, "CellChanged");

object IVisEventProc.VisEventProc(short eventCode, object source, int eventId,
int eventSequenceNumber, object subject, object moreInfo)

{




.
switch (eventCode)

{
case (short)VisEventCodes.visEvtShape + unchecked((short)VisEventCodes.visEvtAdd):
eventShape = (Shape)subject;
handleShapeAdd(eventShape);
break;

case (short)VisEventCodes.visEvtDel + (short)VisEventCodes.visEvtShape:
eventShape = (Shape)subject;
handleShapeDelete(eventShape);
break;

case (short)VisEventCodes.visEvtCell + (short)VisEventCodes.visEvtMod:
Visio.Cell cell = (Cell)subject;
if (cell.Name.IndexOf("Prop") >= 0)//限制只执行自定义事件一次

{
eventShape = cell.Shape;
handleCellModify(eventShape);
}
break;

default:
break;
}

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

/**//// <summary>
/// 形状的类型,即设备类型
/// </summary>
public string ShapeType


/**//// <summary>
/// 形状ID
/// </summary>
public string ShapeID


/**//// <summary>
/// 形状的GUID
/// </summary>
public string ShapeGuid


/**//// <summary>
/// 形状的状态:新增、编辑、删除
/// </summary>
public ShapeStatus ShapeStatus


/**//// <summary>
/// 形状名称
/// </summary>
public string ShapeName
为了更好的管理ShapeLogInfo的相关信息,我们把相同设备类型(ShapeType)的放到一起管理,于是,我们再创建一个ShapeTypeLogInfo类来装载相关的日志信息,具体如下:

/**//// <summary>
/// 形状类型
/// </summary>
public string ShapeType


/**//// <summary>
/// 形状类型对应的数据库表名称
/// </summary>
public string ShapeTableName


/**//// <summary>
/// 该形状类型对应的形状日志对象集合
/// </summary>
public Dictionary<string, ShapeLogInfo> ShapeColloction
为了判断是否有相应的ShapeTypeLogInfo和ShapeLogInfo,需要定义几个函数用来维护相关的集合信息,如下所示:

/**//// <summary>
/// 获取形状对应的类型,如果没有则创建
/// </summary>
private ShapeTypeLogInfo GetShapeType(ShapeLogInfo shape)


/**//// <summary>
/// 如果集合中有,修改状态;否则添加一个新的
/// </summary>
public void AddLog(ShapeLogInfo shapeLogInfo)


/**//// <summary>
/// 判断指定的形状是否是在集合中存在
/// </summary>
public bool IsNewShape(ShapeLogInfo shape)



/**//// <summary>
/// 取当前设备在集合中存储的ShapeLog对象
/// </summary>
public ShapeLogInfo GetShape(string shapeType, string shapeId)
完成这些函数后,最后需要做的就是在添加、删除、修改Shape的侦听事件中加入相关的日志就可以了,如在删除设备的时候,我们是这样记录相关信息的
private void visioEventSink_OnShapeDelete(object sender, EventArgs e)


{
Shape shape = (Shape)sender;
string strDeviceType = string.Empty;
string strDeviceName = string.Empty;
string strDeviceID = string.Empty;

strDeviceType = VisioUtility.GetShapeCellValue(shape, "设备类型");
strDeviceID = VisioUtility.GetShapeCellValue(shape, "GUID");


ShapeLogInfo logInfo = new ShapeLogInfo();
logInfo.ShapeType = strDeviceType;
logInfo.ShapeID = shape.NameID;
logInfo.ShapeName = VisioUtility.GetShapeCellValue(shape, "名称");

if (shape.Application.IsUndoingOrRedoing)

{
ShapeLogInfo info = Portal.gc.gOperationLog.GetShape(strDeviceType, shape.NameID);
if (info != null)

{
strDeviceID = info.ShapeGuid;
}
}

logInfo.ShapeGuid = strDeviceID;
logInfo.ShapeStatus = ShapeStatus.DeleteShape;
Portal.gc.gOperationLog.AddLog(logInfo);
}
其中if (shape.Application.IsUndoingOrRedoing)是为了判断该操作是否为Undo或者Redo导致的操作,如果是,我们获取它之前Shape的GUID即可。
记录了设备的这些修改信息,我们就可以在保存数据的时候,根据这些信息移除相关的关系,添加或者删除相关的设备信息了,而且这些信息,对于我们记录用户的图纸修订记录也是必须要做的事情。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· .NET10 - 预览版1新功能体验(一)