2012-08-28 2 views
3

J'ai créé un formulaire personnalisé avec deux boutons et une zone de texte.C# Formulaire personnalisé lançant COMException à la sortie

Ce formulaire personnalisé est ouvert par un bouton d'événement de clic que j'ai créé sur un complément Microsoft Outlook sur lequel je travaille attaché à un 'Ruban'. (Je ne sais pas si cela compte, pas de problème ici).

Sur le formulaire Windows, le premier bouton enregistre simplement le contenu du fichier texte sur le disque.

L'autre bouton tente de fermer le formulaire. Dans cet événement de clic de bouton, j'ai essayé les deux lignes suivantes, séparément et ensemble

this.Close(); et this.Dispose();

Lorsque j'utilise ce bouton ou la sortie de formulaire (le « x » situé dans le coin supérieur droit d'une forme de fenêtres) Je reçois l'erreur de suivi,

COMException était non gérée par l'utilisateur Exception de HRESULT: 0x800A01A8

Lorsque cette erreur est levée, il me prend pour les fichiers 'Connect.cs de la méthode suivante,

public void OnBeginShutdown(ref System.Array custom) 
     { 

      this.toolbarButton.Delete(System.Reflection.Missing.Value); 
      this.toolbarButton = null; 

     } 

Je ne sais pas comment commencer la résolution de ce sujet. J'ai fait beaucoup de recherches mais malheureusement je n'ai pas trouvé grand-chose. Je suis sûr que le problème est peut-être le fait que j'ai créé un formulaire personnalisé sans expérience et qu'il y a des «pratiques» ou des «bonnes pratiques» que je n'ai pas faites ou dont je suis au courant.

Quelqu'un at-il un aperçu de cela?

+0

Ce code va exploser lorsqu'il sera * deux fois *. Pas tout à fait improbable puisque Form.Close() inclut normalement déjà une disposition. Ajoutez 'if (this.toolbarButton! = Null)' pour être sûr. –

Répondre

0

Je devine un peu ici, mais que HResult pour un COMException signifie Object Required, Ainsi, lorsque vous appelez CommandBarButton.Delete une des deux choses ne va pas. Vous avez déjà disposé l'instance de bouton ou vous devez passer true ou false à l'appel Delete.

Le bouton ne doit pas être mis au rebut avant d'avoir été retiré de la barre d'outils. Une fois qu'il a été retiré, vous devrez peut-être faire un Marshal.ReleaeComObject pour le déréférencer correctement.