2011-08-10 4 views
1

Je suis en train de gérer un événement lorsque des éléments sont ajoutés dans un diagramme, mais AddAdvice() renvoie une exception non gérée COM:Visio AddAdvice génère une exception

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; 

     } 
    } 
} 

Répondre

0

ne suis pas sûr l'exception que vous voyez avec AddAdvise, mais pourquoi ne pas ignorer AddAdvise et utiliser les wrappers d'événements gérés fournis par la couche d'interopérabilité de Visio? Y at-il une raison d'utiliser AddAdvise au lieu de l'assembly d'interopérabilité primaire Visio?

Pouvez-vous simplement ajouter un gestionnaire pour l'événement ShapeAdded directement sur le contrôle lui-même? Ou, sinon sur le contrôle, alors certainement sur le Visio.Document contenu dans le contrôle.

Voir aussi l'exemple de code dans ce post forum:

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

Et la réponse à cette autre question stackoverflow:

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

+0

merci! J'ai commencé à utiliser ce genre d'événements, mais BeforeShapeDekete n'a pas tiré pour une raison quelconque –

0

Ajouter ceci:

using System .Runtime.InteropServices;

Et où vous avez ceci:

public class EventSink : Visio.IVisEventProc{ 

Mettez ceci:

[ComVisible(true)] 
public class EventSink : Microsoft.Office.Interop.Visio.IVisEventProc{ 
Questions connexes