System.ObjectDisposedException来自简单表单显示

时间:2009-09-16 02:53:04

标签: c# .net winforms

我正在试图弄清楚当简单地显示WinForms对话框(下面的代码)时,我得到以下异常和callstack。这不会一直发生,但我在异常日志中看到它。有任何想法吗?我无法弄清楚引用被处置对象的内容是什么?

我已经验证(通过其余的callstack)应用程序没有关闭,它正常运行。

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)

这是显示对话框的代码。唯一的“傻瓜”代码可能是textPassword_KeyDown处理程序。我应该拉出我想要的代码而不是那样调用btnOK_Click。

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

2 个答案:

答案 0 :(得分:0)

嗯,有一种可能是你将DialogResult设置为Ok,这将关闭表单,但是你可以参考按Enter键触发的eventarg。 不过,我不太确定超链接edit1位的作用。它是在同一个表格还是一个表格?

答案 1 :(得分:0)

您的堆栈跟踪告诉我您没有进入ProfileForm代码。它在某些控件的CreateHandle上失败了。没有更多信息,我只能猜测:

  1. 确认您正在执行GUI线程上正在进行的所有UI操作。即使你认为它是,仔细检查。 (有时线程可能很微妙。)

  2. 确保您没有尝试两次显示相同的表单实例,第二次已经处理完毕。我发现你发现了ShowDialog(),但是如果你试图在ShowDialog()处理已经处理好的表格,我会发现它会像这样爆炸。

    < / LI>
  3. 确保表单上的所有用户控件都正常运行。

  4. 考虑为您的密码字段使用安全字符串。