【问题标题】:Viso VSTO - ShapeAdded event not firing (sometimes)Viso VSTO - ShapeAdded 事件未触发(有时)
【发布时间】:2018-01-11 13:39:23
【问题描述】:

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

这是我的加载项功能的基本概述:

  1. 用户向页面添加形状
  2. 在 ShapeAdded 上,会显示一个表单。
  3. 用户在表单中输入文本,按下搜索按钮
  4. 调用存储过程(参数 = 用户文本)
  5. Form 的 datagridview 填充了结果。
  6. 需要用户双击结果行。
  7. 表单关闭,选定的值变为形状文本。

如果我在第 (3) 项之后注释掉我的代码 - 那么我的事件处理程序会继续触发而不会出现问题。我可以整天添加新形状。

但是——一旦我让代码调用存储过程(第 4 步),就会出现问题。 非常具体:da.Fill(dt) 我可以管理 1 到 6 个形状添加,但迟早,事件会停止触发。 (* 1 月 8 日更新:记录集大小似乎会影响问题。当每次返回 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 模板
  • 自述文件.txt

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

【问题讨论】:

    标签: c# vsto visio


    【解决方案1】:

    我认为这里的问题是您没有将 doc 对象保留在范围内,Visio 将停止报告没有参考的事件。

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

    public partial class ThisAddIn
    {
        private Visio.Document _targetDoc = null;
    
        private void ThisAddIn_Startup(object sender, System.EventArgs e)
        {
            Application.MarkerEvent += Application_MarkerEvent;
        }
    
        public void SetDocEvents()
        {
            _targetDoc = Globals.ThisAddIn.Application.ActiveDocument;
    
            // set event handler
            try
            {
                _targetDoc.ShapeAdded += onShapeAdded;
            }
            catch (Exception err)
            {
                System.Diagnostics.Debug.WriteLine(err.Message);
                throw;
            }
        }
    

    【讨论】:

    • 约翰,绝对出色 - 我开始认为这个人会永远让我受益。太感谢了。猜想可能会有微调以适应用户在文档之间切换,但与弄清楚这里的主要概念相比,这应该是小菜一碟。非常感谢您,先生。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 2015-12-19
    • 1970-01-01
    相关资源
    最近更新 更多