【问题标题】:Excel add-in ribbon click events bubblingExcel 加载项功能区单击事件冒泡
【发布时间】:2015-11-24 07:28:18
【问题描述】:

我在 MSDN 上关注这个演练:Creating a Custom Tab by Using the Ribbon Designer

查看第 3 步和第 4 步:

在第 3 步中,它向ribbon_Load 函数添加了一个事件处理程序,基本上是向功能区中的按钮添加了一个点击事件:

private void MyRibbon_Load(object sender, RibbonUIEventArgs e)
{
    this.button1.Click += new RibbonControlEventHandler(this.button1_Click);
}

然后,在第 4 步中,他们以我更习惯的方式添加另一个事件处理程序,如下所示:

private void button1_Click(object sender, RibbonControlEventArgs e)
{
    MergeReportInterface ui = new MergeReportInterface();
    ui.ShowDialog();
}

我并不真正理解这样做的目的,因为它所做的只是导致事件触发两次。如果我注释掉添加到load 函数中的事件处理程序,则该事件会发生一次。

有人可以向我解释一下这是什么意思吗?如果有的话,或者 MSDN 网站上是否有错误。 处理功能区点击事件的正确方法应该是什么?

【问题讨论】:

    标签: c# excel events vsto


    【解决方案1】:
    private void button1_Click(object sender, RibbonControlEventArgs e)
    {
        MergeReportInterface ui = new MergeReportInterface();
        ui.ShowDialog();
    }
    

    不是添加事件处理程序。这是您的事件将调用的方法。

    this.button1.Click += new RibbonControlEventHandler(this.button1_Click);
    

    这是说'当 button1 触发其 Click 事件时,调用 this.button1_Click'。

    您的代码只设置了一个事件处理程序,它应该只触发一次。

    然而,您很可能通过双击表单设计器上的按钮创建了button1_Click 方法。这在幕后添加了一个额外的事件处理程序。这就是为什么您要触发两次事件的原因。

    所以你有两个选择:

    返回 IDE 并通过表单设计器删除点击处理程序。转到您的代码并手动编写方法button1_Click

    删除此行:this.button1.Click += new RibbonControlEventHandler(this.button1_Click);,因为 VisualStudio 会自动为您执行此操作。

    【讨论】:

    • 好的,现在说得通了。什么是首选方法?还是真的不重要?
    • @Adjit 完全没有区别。让视觉工作室来做这件事可能更容易,至少对于表单控件来说是这样。但是,如果您要动态生成控件,则需要手动完成
    猜你喜欢
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多