2009-03-13 7 views
1

Ich versuche, ein COM-Addin für Excel XP in C# zu schreiben, das das Doppelklicken auf eine Zelle deaktiviert, um es zu bearbeiten.SheetBeforeDoubleClick von COM Addin

Ich möchte eine Box öffnen, die besagt, dass das Bearbeiten einer Zelle auf diese Weise verboten ist und dann alle Ausführung stoppen.

Blick durch die Dokumentation zu Microsoft dies wie eine sehr einfache Aufgabe scheint, erstellen Sie eine Anwendungsereignis AppEvents_SheetBeforeDoubleClickEventHandler mit der Unterschrift func(object sheet, Range Target, ref bool Cancel) und Sie setzen Cancel auf true, so dass die Ausführung stoppt.

Ich habe folgendes:

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; 
} 

Das Meldungsfeld wird angezeigt, aber die Zelle dann in den Bearbeitungsmodus versetzt wird, aber wenn ich die gleiche Sache von VBA haben es funktioniert.

Das gleiche passiert mit einem VB.NET Addin mit dem folgenden Code.

Antwort

3

Ich hatte keine Probleme bei der Ausführung Ihres Codes: die 'Abbrechen' verhindert den Doppelklick-Vorgang.

Einige Suche ergab das folgende von MSKB: BUG: Cancel parameter for Office events is ignored in Visual Studio .NET 2003.

Dieses Verhalten des Ignorierens des Cancel-Parameters scheint für Excel-Versionen 2002 und darunter zu existieren, wenn .NET-Code verwendet wird, der mit Visual Studio .NET (.NET Framework 1.1) erstellt wurde.

Es gibt eine komplexe Umgehung in dem Artikel, der die manuelle Anpassung der Interop-Baugruppe beinhaltet. Es sieht jedoch ziemlich machbar aus, wenn es eine ziemlich große Anstrengung ist.

Es wäre einfacher zu VS 2005 oder VS .NET 3.5 2008. Ich kompilierte meinen Code mit VS 2008 Targeting, zu aktualisieren und lief meinen Code auf Excel 2007.

By the way, wird der Benutzer in der Lage sein, Geben Sie einen Wert ein, indem Sie in die Formelleiste eintippen, einen Befehl zum Kopieren oder Einfügen oder Ähnliches ausführen. Um zu verhindern, dass der Benutzer einen Wert eingibt, schützen Sie stattdessen möglicherweise das Arbeitsblatt.

+0

Hey, wollte nur sagen, danke für die Zeit. Ich habe kürzlich an einem Projekt gearbeitet, für das ich diese Art von Funktionalität benötige, und ich kompiliere tatsächlich mit VS 2008 mit .NEt 3.5, aber für Excel 2002. Ich werde die Problemumgehung versuchen. Danke noch einmal. –

+0

Laut diesem Artikel sollten Sie mit VS 2008 in Ordnung sein. Hmmm ... Ok, möchten Sie vielleicht überprüfen Sie http://support.microsoft.com/kb/948461. Es besagt, dass ein Fehler ausgelöst werden sollte, aber wenn nicht, dann kann .NET 1.1 einfach ruhig ausgeführt werden und daher das Verhalten "Ereignis abbrechen" ignorieren. –