我正在试图弄清楚当简单地显示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();
}
}
答案 0 :(得分:0)
嗯,有一种可能是你将DialogResult设置为Ok,这将关闭表单,但是你可以参考按Enter键触发的eventarg。 不过,我不太确定超链接edit1位的作用。它是在同一个表格还是一个表格?
答案 1 :(得分:0)
您的堆栈跟踪告诉我您没有进入ProfileForm
代码。它在某些控件的CreateHandle上失败了。没有更多信息,我只能猜测:
确认您正在执行GUI线程上正在进行的所有UI操作。即使你认为它是,仔细检查。 (有时线程可能很微妙。)
确保您没有尝试两次显示相同的表单实例,第二次已经处理完毕。我发现你发现了ShowDialog()
,但是如果你试图在ShowDialog()
处理已经处理好的表格,我会发现它会像这样爆炸。
确保表单上的所有用户控件都正常运行。
考虑为您的密码字段使用安全字符串。