Viso VSTO - ShapeAdded事件未触发(有时)

时间:2018-01-03 16:53:41

标签: c# vsto visio

在我的Visio加载项中,我为' ShapeAdded'设置了一个处理程序。 这会为添加的前2个或3个形状触发,但之后只会完全停止。

以下是我的加载项功能的基本概要:

  1. 用户向页面添加形状
  2. 在ShapeAdded上,会显示一个表单。
  3. 用户在表单中输入文字,按下搜索按钮
  4. 调用存储过程(参数=用户文本)
  5. 表单的datagridview中填充了结果。
  6. 用户双击所需的结果行。
  7. 表单关闭,所选值变为形状文本。
  8. 如果我在第(3)项之后注释掉我的代码 - 那么我的事件处理程序会继续触发而不会出现问题。我可以整天添加新的形状。

    但是 - 一旦我让代码调用存储过程(步骤4),那么问题就出现了。 非常具体:da.Fill(dt) 我可以管理1到6个形状的添加,但迟早,事件才会停止射击。 (*更新1月8日:Recordset大小似乎影响了这个问题。每次返回1100行时,我设法在我的页面上添加大约6个形状。每次返回3行时,我最多可以添加18个形状。事件停止射击。 这告诉我有些东西不干净'关于我处理数据通话的方式 - 但我看不出它是什么!!)

    我完全不知道为什么调用存储过程会干扰我的事件处理程序!?!? 特别是没有任何错误消息。

    有没有人对我可能做错了什么有任何想法? 甚至,关于如何以更好的方式调试它的想法?

    public partial class ThisAddIn
        {
            private void ThisAddIn_Startup(object sender, System.EventArgs e)
            {
                Globals.ThisAddIn.Application.MarkerEvent += new Visio.EApplication_MarkerEventEventHandler(Application_MarkerEvent);
            }
    
            private void Application_MarkerEvent(Visio.Application visapp, int SequenceNum, string ContextString)
            {
                if (ContextString.Contains("soln=myApplication") && ContextString.Contains("/cmd=DocCreated"))
                {
                    SetDocEvents();
                }
            }
    
            public void SetDocEvents()
            {
                 Microsoft.Office.Interop.Visio.Document doc = Globals.ThisAddIn.Application.ActiveDocument;
    
                // set event handler
                try
                {
                    doc.ShapeAdded += new Microsoft.Office.Interop.Visio.EDocument_ShapeAddedEventHandler(onShapeAdded);
                }
                catch (Exception err)
                {
                    System.Diagnostics.Debug.WriteLine(err.Message);
                    throw;
                }
            }
    
            private void onShapeAdded(Visio.Shape Shape)
            {
                Form_Entity fe = new Form_Entity(Shape.Text);
                fe.ShowDialog();
                fe.Dispose();
            }
    
        // ... other stuff
    }
    

    表格代码:

    public partial class Form_Entity : Form
    {
        public Int32 eid { get { return m_id; } }
        public string ename { get { return m_name; } }
        public string eabbr { get { return m_abbr; } }
    
        private Int32 m_id;
        private string m_name;
        private string m_abbr;
    
        public Form_Entity()
        {
            InitializeComponent();
        }
        public Form_Entity(String search)
        {
            InitializeComponent();
            txt_search.Text = search;
        }
    
        private void Cmd_Search_Click(object sender, EventArgs e)
        {
            String sample = txt_search.Text;
    
            DataTable dt = new DataTable();
    
    SqlConnection myConn = new SqlConnection("Server=xxxxxxx;Database=xxxxxxxx;Trusted_Connection=True;");
            myConn.Open();
            SqlCommand myCmd = new SqlCommand("[dbo].[mySearch]", myConn);
            myCmd.Parameters.Add(new SqlParameter("@searchText", sample));
            myCmd.CommandType = CommandType.StoredProcedure;
            SqlDataAdapter da = new SqlDataAdapter(myCmd);
            da.Fill(dt);
            dataGridView1.DataSource = dt;
    
            myCmd.Dispose();
            myConn.Close();
    
        }
    }
    

    **此项目的文件

    • Visual Studio解决方案
    • T-SQL创建样本表/ data.procedure
    • Viso模板
    • 的ReadMe.txt

    http://www.netshed.co.uk/temp/Vis_Sample.zip

1 个答案:

答案 0 :(得分:1)

我认为这里的问题是您没有将./model对象保留在范围内,而Visio将停止报告没有引用的事件。

您可以按如下方式添加字段(或属性),然后应保留引用和关联事件:

doc