2

我的 excel 加载项中有一个 winform 对话框,单击面板按钮会弹出该对话框。我在工作表中添加了一个选择更改事件。该事件不是第一次被触发。我必须关闭对话框并再次打开它,这一次它会起作用。我在这里遗漏了什么,或者它是 excel interop API 的错误?

环境:Excel 2007,.NET 4.0,互操作运行时: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();
      }
 }
4

1 回答 1

3

阅读您的评论后,我认为这个问题(以及可能出现的其他问题)源于与 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)。并确保只定义一次事件(在开始时),并且只将给定的工作表分配给变量一次(在开始时)。

于 2013-08-23T09:50:42.440 回答