我这是一个登录框,在登录成功之后,要把登录框隐藏,显示主窗体,就像QQ的登录框一样。代码就三行:
private void btnCancel_Click(object sender, EventArgs e)
{ this.Hide();
frmMain frmmain = new frmMain();
frmmain.Show();
}
问题是:登录框隐藏了之后,又重新显示出来,连带主窗体也一并显示。之前试过多种方法,比如将frmmain.Show();改成frmmain.ShowDialog();,将this.Hide();调换到其他的位置,还有改成这样的代码:
private void btnCancel_Click(object sender, EventArgs e)
{ this.Hide();
frmMain frmmain = new frmMain();
Application.DoEvents();
frm.ShowDialog();
}
登录框还是没有隐藏。在Program.cs文件中,Main方法如下:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmLogin());
}
我不敢确定是不是 Application.Run(new frmLogin());这一句出了问题。
private void btnCancel_Click(object sender, EventArgs e)
{ this.Hide();
frmMain frmmain = new frmMain();
frmmain.Show();
}
问题是:登录框隐藏了之后,又重新显示出来,连带主窗体也一并显示。之前试过多种方法,比如将frmmain.Show();改成frmmain.ShowDialog();,将this.Hide();调换到其他的位置,还有改成这样的代码:
private void btnCancel_Click(object sender, EventArgs e)
{ this.Hide();
frmMain frmmain = new frmMain();
Application.DoEvents();
frm.ShowDialog();
}
登录框还是没有隐藏。在Program.cs文件中,Main方法如下:
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmLogin());
}
我不敢确定是不是 Application.Run(new frmLogin());这一句出了问题。
[DllImport("User32.dll")]
public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
private void button1_Click(object sender, EventArgs e)
{
ShowWindowAsync(this.Handle,0);
Form2 f = new Form2();
f.Show();
}
好好检查你的代码这是完全没问题的
this.Hide();
frmMain frmmain = new frmMain();
frmmain.Show();
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new frmLogin());
}这段代码的问题,应该这样写:
frmLogin frmlogin = new frmLogin();
if(frmLogin.ShowDialog() != DialogResult.OK)
{
frmlogin.Dispose();
frmlogin = null;
Application.Exit();
return;
}frmlogin.Dispose();
frmlogin = null;
Application.Run(new frmMain());
直接关啊
共同学习
http://topic.csdn.net/u/20100810/11/8eadaeda-046b-4bc6-8bf4-18c030c52a18.html
而我引用的帖子中那位仁兄给的代码可以解决问题。
this.Hide();
frmLogin frm = new frmLogin();
DialogResult result=frm.ShowDialog();
if (result != DialogResult.OK)
{
this.Close();
return;
}
新线程关闭原窗口,打开新窗口
private void button1_Click(object sender, EventArgs e)
{
Thread th = new Thread(new ThreadStart(new MethodInvoker(delegate
{
this.Invoke(new MethodInvoker(delegate { this.Close(); }));
Application.Run(new frmain());
})));
th.Start();
}
btnOK_Click里面的代码太长,又是连接数据库又是提交验证的,所以写在btnCancel_Click里面,当作是测试代码,我在其他窗体试过,没问题,唯独这个登录框出错,他加载了两次,我也找不到原因。
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Login lg = new Login();//该窗体为登录窗体
if (lg.ShowDialog() == DialogResult.OK)
{
Application.Run(new MDIMain());//运行主窗体(MDIMain())
}
//同时在login窗体中的确定按钮下添加:
this.DialogResult = DialogResult.OK;
this.Close();
frmLogin frmlogin = new frmLogin();
if(frmLogin.ShowDialog() != DialogResult.OK)
{
frmlogin.Dispose();
frmlogin = null;
Application.Exit();
return;
}frmlogin.Dispose();
frmlogin = null;
Application.Run(new frmMain());
您给出的以上代码,我试过了,不能解决问题,if块后面的语句根本执行不到,就是不停的弹出新窗口出来。
public static extern bool ShowWindowAsync(IntPtr hWnd, int cmdShow);
private void button1_Click(object sender, EventArgs e)
{
ShowWindowAsync(this.Handle,0);
Form2 f = new Form2();
f.Show();
}找不到User32.dll文件
{
this.Hide();
frmMain frmmain = new frmMain();
frmmain.Show();
}
//------------------------------------------
//既然Cancel了。就直接关闭好了
private void btnCancel_Click(object sender, EventArgs e)
{
this.Close();
}//OK中写private void btnOK_Click(object sender, EventArgs e)
{
new Thread((ThreadStart)delegate
{
Application.Run(new frmMain());
}).Start();
this.Close();
}
frmlogin.show();
Application.Run();然后其他操作可以保留原样
static void Main()
{
//...
}
我在大部分情况下,是以main做为主窗体,new 出login,login中可以用事件触发父窗体事件,比如登陆成功,取消,而main窗体的隐藏,往往要通过设置main窗体透明度(opatity)属性为0,登陆成功后回设为1来实现.
Login lg = new Login();//该窗体为登录窗体
if (lg.ShowDialog() == DialogResult.OK)
{
Application.Run(new MDIMain());//运行主窗体(MDIMain())
}
这种方法,还是弹性比较好的,在某种程度上不会带来更多的复杂性,需要反复登录的话,把if改为while就可以了.还有一个特殊情况就是程序干脆没有主窗口,即VB那种最后一个窗口关闭才退出(搞过VB的人容易带来这种需求),那就需要自定义ApplicationContext,并在Application中Run这个appContext了
我的做法是
login窗体:using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace WindowsFormsApplication5
{
public partial class Login : Form
{
public bool isok = false;
public Login()
{
InitializeComponent();
} private void buttonCancel_Click(object sender, EventArgs e)
{
isok = false;
this.Visible = false;
} private void buttonLogin_Click(object sender, EventArgs e)
{
isok = true;
this.Visible = false;
}
}
}
main窗体using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;namespace WindowsFormsApplication5
{
public partial class Main : Form
{
public Main()
{
InitializeComponent();
this.Opacity = 0;
} private void Main_Load(object sender, EventArgs e)
{
using( Login lg = new Login())
{
if (lg.ShowDialog() != DialogResult.OK)
{
if (lg.isok)
{
MessageBox.Show("登陆成功");
this.Opacity = 1;
this.Activate();
}
else
{
MessageBox.Show("按扭取消");
Application.Exit();
}
}
else
{
MessageBox.Show("窗口右上角关闭");
Application.Exit();
}
}
}
}
}