Excel工作表SelectionChange事件不会触发第一时间,但可以第二次工作

拉杰夫·辛格(Rajeev Singh)

我的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

的onClick功能仅适用于在第一时间反应过来?

如何通过在ChildEventListener onChildAdded情况称为第一时间之后?

复选框在第一时间不起作用

ViewPropertyAnimator-动画不会在第一时间发生

折叠式工具栏布局不会在第一时间展开,并且销钉不起作用

如何在第一时间连接到备用本地Postgresql集群?

KalmanFilter总是在第一时间预测0,0

熊猫滚动如何保留每个时间窗口的第一时间索引

过渡在第一时间不起作用

第一时间的时间复杂度是多少?

jQuery Deferred的JavaScript承诺仅在第一时间解决

如何从每十二小时发生的每个“组”事件中提取第一时间戳

Elasticsearch确切结果不会在第一时间返回

useState Hook在调用函数的第一时间上不起作用

React在第一时间不呈现useEffect

为什么迭代器没有经过第一时间?

MAGENTO:如何改善第一时间

在php的第一时间包括Session和Cookie

为什么“写”功能在第一时间不起作用?

所显示的引导程序选项卡事件仅在第一时间触发,而不在第二个或更高版本的选项卡开关上触发

为什么创建TagLib :: FileRef仅在第一时间花费时间?

javafx谓词仅在第一时间触发

如果未分类数据的变量在第一时间匹配n次,则SAS分配二进制值

Android Edit Text Cursor的位置在第一时间没有变化

时间戳记:按下F5记事本会给出第一时间,然后是日期。我该如何约会第一时间然后是时间?

第五时间源.zshrc比第一时间需要明显更多的时间

AdsConnection 在第二次连接时抛出 EntryPointNotFoundException 但第一次工作

让 switch stmt 无结果运行,或者检查 switch var 类型以在第一时间不触发它

如何在第一时间获得更新的状态?