2009-09-16 6 views
0

J'essaie de comprendre comment, en affichant simplement une boîte de dialogue WinForms (code ci-dessous), j'obtiens les exceptions Exception et callstack. Cela n'arrive pas tout le temps, mais je le vois dans mes journaux d'exception. Des idées? Je ne peux pas comprendre ce qui serait référencer un objet disposé?System.ObjectDisposedException à partir de l'affichage de formulaire simple

J'ai vérifié (via le reste de la pile d'appel) que l'application ne s'éteint pas, elle fonctionne normalement.

System.ObjectDisposedException: Cannot access a disposed object.  
Object name: 'MainForm'.  
    at System.Windows.Forms.Control.CreateHandle()  
    at System.Windows.Forms.Form.CreateHandle()  
    at System.Windows.Forms.Control.get_Handle()  
    at System.Windows.Forms.Control.GetSafeHandle(IWin32Window window)  
    at System.Windows.Forms.Form.ShowDialog(IWin32Window owner)  
    at MyApp.MainForm.PromptForProfile()  
    at MyApp.MainForm.LoadProfile()  
    at MyApp.MainForm.barButtonItem1_ItemClick(Object sender, ItemClickEventArgs e) 

Ceci est le code de la boîte de dialogue affichée. Le seul code "goofy" est probablement le gestionnaire textPassword_KeyDown. Je devrais probablement tirer le code que je veux sortir et n'appelle pas btnOK_Click de cette façon.

public partial class ProfileForm : DevExpress.XtraEditors.XtraForm 
    { 
     public string _username; 
     public string _password; 

     public ProfileForm() 
     { 
     InitializeComponent(); 
     } 

     private void btnOK_Click(object sender, EventArgs e) 
     { 
     _username = textUsername.Text; 
     _password = textPassword.Text; 
     } 

     private void textPassword_KeyDown(object sender, KeyEventArgs e) 
     { 
     if (e.KeyCode == Keys.Enter) 
     { 
      btnOK_Click(sender, null); 
      this.DialogResult = DialogResult.OK; 
      e.Handled = true; 
     } 
     } 

     private void hyperLinkEdit1_Click(object sender, EventArgs e) 
     { 
     // show the proxy settings dialog 
     ProxyForm pform = new ProxyForm();   
     pform.ShowDialog();   
     } 
    } 
+0

Pour le clic, vous pouvez le faire 'btnOK.PerformClick()' –

+1

semble ne pas possible de deviner le problème du code affiché. Quelque chose pourrait se passer comme un fil, ou la forme principale a soulevé une exception qui l'oblige à se fermer. Vérifiez la communication CrossThread. –

+0

Je suppose que vous devriez probablement jeter cet objet de formulaire aussi après l'appel ShowDialog, ou utiliser un bloc using. –

Répondre

0

Eh bien, un possibilily est que vous configurez DialogResult à Ok, qui clôturera la forme, mais vous alors se référer à la eventarg déclenché en appuyant sur Entrée. Cependant, je ne suis pas très sûr du rôle du bit d'édition de lien hypertexte1. Est-ce sur la même forme ou sur un formulaire d'appel?

0

Votre trace de pile m'indique que vous n'entrerez pas dans le code ProfileForm. Il échoue sur CreateHandle de certains contrôles. Sans plus d'informations, je ne peux que deviner:

  1. Vérifiez que vous effectuez toutes vos manipulations de l'interface utilisateur se produit sur votre fil d'interface graphique. Même si vous pensez que c'est le cas, vérifiez. (Parfois, le filetage peut être subtil.)

  2. Assurez-vous que vous n'essayez pas d'afficher la même instance de formulaire deux fois, la deuxième fois après qu'elle a déjà été éliminée. Je vois que vous avez un ShowDialog() qui se passe, mais si vous essayez de ShowDialog() sur un formulaire qui a déjà été éliminé, je m'attendrais à ce qu'il explose comme ça.

  3. Assurez-vous que tous les contrôles utilisateur sur le formulaire se comportent correctement. Pensez à utiliser une chaîne sécurisée pour votre champ de mot de passe.

Questions connexes