我的excel加载项中有一个winform对话框,单击面板按钮时会弹出该对话框。我有一个选择更改事件添加到工作表。该事件不是第一次触发。我必须关闭对话框,然后再次打开它,这一次它将起作用。我在这里遗漏了什么吗,还是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);
}}
这就是创建列的调用方式
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
其他方式或通过其他方式),则必须使用其他变量或通过保留相同的变量再次重做此过程(变量分配和事件分配)。
摘要:从中删除工作表和事件定义CreateColumn()
。在开始与给定的工作表进行交互之前(在之前smartTemplateBtn_Click
),请正确放置此位置。并确保仅一次定义事件(在开始时),并且仅将给定工作表分配给变量一次(在开始时)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句