Viso VSTO - ShapeAdded 事件未触发(有时)
Viso VSTO - ShapeAdded event not firing (sometimes)
在我的 Visio 加载项中,我为 'ShapeAdded' 设置了一个处理程序。
这为添加的前 2 或 3 个形状触发,但随后完全停止触发。
以下是我的加载项功能的基本概述:
- 用户向页面添加形状
- 在 ShapeAdded 上,显示一个表单。
- 用户在表单中输入文本,按下搜索按钮
- 调用存储过程(参数=用户文本)
- 表单的数据网格视图填充了结果。
- 需要用户双击结果行。
- 表单关闭,所选值变为形状文本。
如果我在第 (3) 项之后注释掉我的代码 - 那么我的事件处理程序会继续触发而不会出现问题。我可以整天添加新形状。
但是 - 一旦我让代码调用存储过程(第 4 步),就会出现问题。
非常具体:da.Fill(dt)
我可能会添加 1 到 6 个形状,但迟早事件会停止触发。
(* 1 月 8 日更新:记录集大小似乎影响了这个问题。每次返回 1100 行时,我设法向我的页面添加大约 6 个形状。每次返回 3 行时,我最多可以在事件停止触发。
这告诉我我处理数据调用的方式有一些不 'clean' 的东西 - 但我看不到它是什么!!)
我完全不明白为什么调用存储过程会干扰我的事件处理程序!?!?
特别是没有任何错误信息。
有人知道我可能做错了什么吗?
或者,关于如何以更好的方式调试它的想法?
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 创建示例 table/data.procedure
- Viso 模板
- ReadMe.txt
我认为这里的问题是您没有将 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;
}
}
在我的 Visio 加载项中,我为 'ShapeAdded' 设置了一个处理程序。 这为添加的前 2 或 3 个形状触发,但随后完全停止触发。
以下是我的加载项功能的基本概述:
- 用户向页面添加形状
- 在 ShapeAdded 上,显示一个表单。
- 用户在表单中输入文本,按下搜索按钮
- 调用存储过程(参数=用户文本)
- 表单的数据网格视图填充了结果。
- 需要用户双击结果行。
- 表单关闭,所选值变为形状文本。
如果我在第 (3) 项之后注释掉我的代码 - 那么我的事件处理程序会继续触发而不会出现问题。我可以整天添加新形状。
但是 - 一旦我让代码调用存储过程(第 4 步),就会出现问题。
非常具体:da.Fill(dt)
我可能会添加 1 到 6 个形状,但迟早事件会停止触发。
(* 1 月 8 日更新:记录集大小似乎影响了这个问题。每次返回 1100 行时,我设法向我的页面添加大约 6 个形状。每次返回 3 行时,我最多可以在事件停止触发。
这告诉我我处理数据调用的方式有一些不 'clean' 的东西 - 但我看不到它是什么!!)
我完全不明白为什么调用存储过程会干扰我的事件处理程序!?!? 特别是没有任何错误信息。
有人知道我可能做错了什么吗? 或者,关于如何以更好的方式调试它的想法?
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 创建示例 table/data.procedure
- Viso 模板
- ReadMe.txt
我认为这里的问题是您没有将 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;
}
}