首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Visio AddAdvice引发异常

Visio AddAdvice引发异常
EN

Stack Overflow用户
提问于 2011-08-10 21:26:40
回答 2查看 1.1K关注 0票数 1

当元素被添加到图中时,我试图处理一个事件,但是AddAdvice()抛出了一个未处理的COM异常:

代码语言:javascript
运行
复制
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Visio = Microsoft.Office.Interop.Visio;

namespace VisioAddAdviceWinForms
{
    public partial class Form1 : Form
    {
        private EventSink eventSink = null;

        public Form1()
        {
            InitializeComponent();

            this.eventSink = new EventSink();
            unchecked
            {
                axDrawingControl1.Window.EventList.AddAdvise(((short)Visio.VisEventCodes.visEvtAdd + (short)Visio.VisEventCodes.visEvtShape), this.eventSink, "", "");
            }
        }
    }

    public class EventSink : Visio.IVisEventProc
    {
        object Visio.IVisEventProc.VisEventProc(
                short eventCode,
                object source,
                int eventID,
                int eventSeqNum,
                object subject,
                object moreInfo)
        {
            Visio.IVApplication app = null;
            Visio.IVDocument doc = null;
            Visio.IVShape shape;
            try
            {
                if (source is Visio.IVApplication)
                {
                    app = (Visio.Application)source;
                }
                else if (source is Visio.IVDocument)
                {
                    doc = (Visio.Document)source;
                }
                switch (eventCode)
                {
                    case unchecked((short)Visio.VisEventCodes.visEvtAdd) +
                    (short)Visio.VisEventCodes.visEvtShape:
                        shape = (Visio.Shape)subject;
                        MessageBox.Show("added");
                        break;

                    case (short)Visio.VisEventCodes.visEvtApp +
                    (short)Visio.VisEventCodes.visEvtNonePending:
                        MessageBox.Show("pending");
                        break;

                    case (short)Visio.VisEventCodes.visEvtDel + (short)
                    Visio.VisEventCodes.visEvtShape:
                        shape = (Visio.Shape)subject;
                        MessageBox.Show("deleted");
                        break;

                    default:
                        break;
                }
            }
            catch (Exception err)
            {
                MessageBox.Show("Exception in IVisEventProc.VisEventProc: "
                        + err.Message);
            }

            return null;

        }
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-08-12 02:48:45

不确定您在AddAdvise中看到的异常,但为什么不绕过AddAdvise,使用由Visio层提供的托管事件包装器呢?是否有理由使用AddAdvise而不是Visio主互操作程序集?

您可以直接在控件本身上为ShapeAdded事件添加一个处理程序吗?或者,如果不在控件上,则肯定在控件内包含的Visio.Document上。

另请参阅此论坛帖子中的示例代码:

http://social.msdn.microsoft.com/Forums/en-US/vsto/thread/c80df85f-4e97-4f4c-8563-52cb40786b13/

另一个堆栈溢出问题的答案是:

C# - Is there any OnShapeMoved or OnShapeDeleted event in Visio?

票数 0
EN

Stack Overflow用户

发布于 2012-03-15 19:43:29

添加以下内容:

使用System.Runtime.InteropServices;

你在哪里有这个:

代码语言:javascript
运行
复制
public class EventSink : Visio.IVisEventProc{  

放在这里:

代码语言:javascript
运行
复制
[ComVisible(true)]
public class EventSink : Microsoft.Office.Interop.Visio.IVisEventProc{
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7011529

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档