winform窗体弹窗体的问题

来源:百度知道 编辑:UC知道 时间:2024/06/20 11:26:39
我有一个Longing登陆窗体,当密码正确就弹出主窗体FrmMain,因为我设置FrmMain为Mdi父窗体,所以"frm.Show()"这行就报错“未将对象引用设置到新的实例。。。”,如果不设它为Mdi就没错,该怎么解决,是不是就不设为Mdi算了?我真的很想需要设置为Mdi,下面的是登陆窗体确定按钮的事件。(在FrmMaim构造函数传递Longin窗体是因为它是主线程到时候FrmMain关闭时其实是关闭Longin的,这个不是重点)
private void btnOK_Click(object sender, EventArgs e)
{
FrmMain frm = new FrmMain(this);
this.Hide();
frm.Show();
}

可能的问题
FrmMain 在 btnOK_Click 里声明,可能会造成 btnOK_Click 完成后 frm 就自动被回收

加入登录窗体比较合适的作法是修改 Progrme.cs 中的 main 方法的内容

FrmLogin fmLogin = new FrmLogin();
// 在 FrmLogin 的 btnOK_Click 中,在验证成功后,加入
// this.DialogResult = DialogResult.OK;
// Close();
if(frmLogin.ShowDialog() == DialogResult.OK)
{
Application.Run(new FrmMain());
}

俨然有错,MDI窗体怎么着也得有个父窗体, 就算LOGIN是父窗体,你把它隐藏了,你让子窗体怎么显示出来, 俨然一空中楼阁.

另外, 整个程序的设计思路也是有问题的, LOGIN窗体就是登录而已,它也不能当父窗体啊.

建议:
1. 将FrmMain设为MDI父窗体的架子, 再建一个窗体,当成MDI的子窗体.
2. LOGIN的BUTTON CLICK事件中: 直接
FrmMain frm = new FrmMain();
this.Hide();
frm.Show();
3.当FrmMain点了关闭事件后,直接调用Application.exit()方法即可.

private void btnOK_Click(object sender, EventArgs e)
{
FrmMain frm = new FrmMain(this);
this.Hide();
frm.ShowDialog;
}

你可以先 frm.Show(); 然后在this.Hide();