【问题标题】:SheetBeforeDoubleClick from COM Addin来自 COM 插件的 SheetBeforeDoubleClick
【发布时间】:2010-10-13 04:36:25
【问题描述】:

我正在尝试用 C# 为 Excel XP 编写一个 COM 插件,该插件禁止双击单元格进行编辑。

我想弹出一个框,说禁止以这种方式编辑单元格,然后停止所有执行。

查看 Microsoft 的文档这似乎是一项非常简单的任务,您创建一个带有签名 func(object sheet, Range Target, ref bool Cancel) 的应用程序事件 AppEvents_SheetBeforeDoubleClickEventHandler 并将 Cancel 设置为 true 以便停止执行。

我有以下几点:

public void OnConnection(object application, Extensibility.ext_ConnectMode connectMode, object addInInst, ref System.Array custom)
{
    Excel.Application app = application as Excel.Application;
    app.SheetBeforeDoubleClick += Excel.AppEvents_SheetBeforeDoubleClickEventHandler(beforeDoubleClick);
}

void beforeDoubleClick(object sheet, Excel.Range Target, ref bool Cancel)
{
    MessageBox.Show("Cannot edit cells this way sorry.");
    Cancel = true;
}

显示消息框,但单元格随后进入编辑模式,但是,如果我从 VBA 获得相同的内容,它可以工作。

使用以下代码的 VB.NET 插件也会发生同样的情况。

Private WithEvents app As Excel.Application
Public Sub OnConnection(ByVal application As Object, 
                            ByVal connectMode As Extensibility.ext_ConnectMode, 
                            ByVal addInInst As Object, 
                            ByRef custom As System.Array) 
                            Implements Extensibility.IDTExtensibility2.OnConnection
    app = application
End Sub

Sub Worksheet1_BeforeDoubleClick(ByVal obj As Object, 
                                 ByVal Target As Excel.Range, 
                                 ByRef Cancel As Boolean) 
                                 Handles app.SheetBeforeDoubleClick
    MsgBox("Double-clicking in this sheet is not allowed.")
    Cancel = True
End Sub

【问题讨论】:

    标签: c# excel vba com add-in


    【解决方案1】:

    执行您的代码没有问题:“取消”阻止了双击操作。

    一些搜索从 MSKB 中发现了以下内容:BUG: Cancel parameter for Office events is ignored in Visual Studio .NET 2003

    在使用使用 Visual Studio .NET 2003 (.NET Framework 1.1) 创建的 .NET 代码时,Excel 2002 及更低版本似乎存在这种忽略取消参数的行为。

    文章中给出了一个复杂的解决方法,涉及手动调整互操作程序集。不过,如果付出相当大的努力,它看起来还是很可行的。

    升级到 VS 2005 或 VS 2008 会更容易。我使用面向 .NET 3.5 的 VS 2008 编译我的代码,并在 Excel 2007 上运行我的代码。

    顺便说一句,用户将能够通过在公式栏中输入值、执行复制粘贴命令等来输入值。为了防止用户输入值,您可以改为保护工作表。

    【讨论】:

    • 嘿,只是想说声谢谢你花时间。我最近一直在做一个项目,我需要这种功能,实际上我使用 .NET 3.5 使用 VS 2008 编译,但使用 Excel 2002。我会尝试解决方法。再次感谢。
    • 根据那篇文章,您应该可以使用 VS 2008。嗯...好吧,您可能想查看support.microsoft.com/kb/948461。它声明应该抛出一个错误,但如果没有,那么 .NET 1.1 可能只是安静地运行,因此会引发“忽略取消事件”行为?
    猜你喜欢
    • 2011-01-01
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 2012-10-15
    • 2017-03-10
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多