Excel工作表SelectionChange事件不会被第一次触发,但第二次工作

我在我的excel插件中有一个winform对话框,点击面板buttonpopup。 我有一个select更改事件添加到工作表。 事件不是第一次被解雇。 我必须closures对话框并再次打开它,这次它将工作。 我在这里错过了什么,或者它是与Excel Interop API的错误?

环境:Excel 2007,.NET 4.0,Interop运行时:v1.1.4322

以下是代码

public partial class CreateColumn : Form { public CreateColumn() { InitializeComponent(); Excel.Worksheet ws = Globals.ThisAddIn.Application.ActiveSheet; //Bug: this event does not fire the first time.. works on second time. ws.SelectionChange += new Excel.DocEvents_SelectionChangeEventHandler(ColRangeSelChange); } public void ColRangeSelChange(Excel.Range target) { System.Windows.Forms.MessageBox.Show(target.AddressLocal); }} 

这是如何创build列被调用

  private void smartTemplateBtn_Click(object sender, EventArgs e) { Range SelectedRange = Globals.ThisAddIn.Application.Selection; if (SelectedRange != null) { List<string> DataSetLabels = new List<string>(); foreach (Range cell in SelectedRange.Cells) { if (cell.Value2 != null && !cell.Value2.Equals("")) { if (!DataSetLabels.Contains(cell.Value2)) { DataSetLabels.Add(cell.Value2); } } } if (DataSetLabels.Count > 0) { PopupCreateColumnDialog(DataSetLabels); } } } public void PopupCreateColumnDialog(List<string> DataSetLabels) { if (DataSetLabels.Count > 0) { CreateColumn colDialog = new CreateColumn(); colDialog.TopMost = true; colDialog.Show(); } } 

在阅读您的意见之后,我认为这个问题(以及其他可能出现的问题)来源于与Excel的非常好的沟通。 因此,这个问题只是向你展示一个不应该引起任何问题的结构。

在应用程序的开始(或开始分析给定的Excel文件)时,您必须定义要处理的Excel对象,工作簿和工作表(第一个)。 我将通过以下示例关注工作表:

 Excel.Worksheet ws = Globals.ThisAddIn.Application.ActiveSheet; ws.SelectionChange += new Excel.DocEvents_SelectionChangeEventHandler(ColRangeSelChange); 

ColRangeSelChange定义在哪里:

 public void ColRangeSelChange(Excel.Range target) { System.Windows.Forms.MessageBox.Show(target.AddressLocal); } 

处理这个电子表格时,你不需要改变这个定义。 现在给定的方法( ColRangeSelChange )与给定的事件(ColRangeSelChange)相关联,并且每次都会被调用,事件被触发。 如果您不断重新定义工作表和事件,您可能会遇到与协调有关的问题,并且可能会出现奇怪的情况。

如果你想解释一个不同的电子表格(再次通过ActiveSheet或任何其他的意思),你将不得不重做这个过程(variables分配和事件分配)与其他variables或保持相同的。

摘要:从CreateColumn()删除Worksheet和Event定义。 在开始与给定的工作表进行交互之前(在smartTemplateBtn_Click之前)进行此操作。 并确保您只需要定义一次事件(在开始时),并且只将给定的工作表分配给一个variables(在开始时)。