SheetBeforeDoubleClick от COM Addin - PullRequest
       24

SheetBeforeDoubleClick от COM Addin

1 голос
/ 13 марта 2009

Я пытаюсь написать надстройку COM для Excel XP на C #, которая отключает двойной щелчок по ячейке, чтобы отредактировать ее.

Я хочу открыть окно с сообщением, что редактирование ячейки таким образом запрещено, и затем остановить все выполнение.

Просматривая документацию в Microsoft, это кажется очень простой задачей: вы создаете событие Application AppEvents_SheetBeforeDoubleClickEventHandler с подписью func(object sheet, Range Target, ref bool Cancel) и устанавливаете для 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

1 Ответ

3 голосов
/ 16 апреля 2009

У меня не было проблем с выполнением вашего кода: «Отмена» предотвратила операцию двойного щелчка.

При поиске в MSKB обнаружилось следующее: BUG: параметр отмены событий Office игнорируется в Visual Studio .NET 2003 .

Такое поведение игнорирования параметра отмены, по-видимому, существует для версий Excel 2002 и ниже при использовании кода .NET, созданного с помощью Visual Studio .NET 2003 (.NET Framework 1.1).

В статье дан сложный обходной путь, который включает ручную настройку Interop Assembly. Хотя это выглядит вполне выполнимо, если приложить немало усилий.

Было бы проще перейти на VS 2005 или VS 2008. Я скомпилировал свой код, используя VS 2008 для .NET 3.5, и запустил свой код в Excel 2007.

Кстати, пользователь сможет ввести значение, набрав в строке формул, выполнив команду Copy-Paste и т. П. Чтобы пользователь не мог ввести значение, вы можете вместо этого защитить лист.

...