看似简单却搞了半天没有解决的两窗体的问题......

时间:2021-02-22 14:22:02
    ///应用程序的主入口点
    static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new FormMain());
            //Application.Run(new FormLogin());
        }

    //主窗体
    public FormMain()
        {
            //FormLogin login = new FormLogin();//2.
            //login.ShowDialog();//2.
            InitializeComponent();
        }

    //登陆窗体
    public partial class FormLogin : Form
    {
        public FormLogin()
        {
            InitializeComponent();
        }
        //登陆按钮事件
        private void button1_Click(object sender, EventArgs e)
        {
            if (条件)
            {
                FormCardID fc = new FormCardID();
                fc.Show();
                this.Dispose();//1.
            }
            else
            {
                MessageBox.Show("非法用户,拒绝登录!");
            }
        }
    }

如果我把程序入口设置:Application.Run(new FormLogin());
//1. 处只能是:this.hide(); 而不能this.dispose();----记得JAVA可以!
但这样有一个问题就是当我X掉FormMain(),主程序其实还在内存中运行!我如何让主程序也随FormMain()一起Close()掉?

如果我把程序入口设置:Application.Run(new FormMain());
//2. 处代码当然要启用!
但这样也有一个问题就是当我X掉FormLogin(),FormMain()自动运行了,主程序可以随FormMain()一起Close()掉?
但是没有实现FormLogin()验证的功能!

请教如何解决??

18 个解决方案

#1


Application.Run(new FormMain());
在FormMain窗体的构造函数中添加
FormLogin frm = new FormLogin();
frm.ShowDialog();
登录窗口按下登录按钮后返回用户名密码给主窗体执行验证

#2


  进行判断  如果2个窗体都close 了     就 application.exit()


我是小菜鸟!   说的不好清见谅,   希望能够帮到你!

#3


frm.ShowDialog();就行了。主窗体启东也没有关系,模态的窗体会把焦点获取过来的。只有模态窗体关闭的时候主窗体才能用的 

#4


引用 1 楼 kiraqian 的回复:
Application.Run(new FormMain()); 
在FormMain窗体的构造函数中添加 
FormLogin frm = new FormLogin(); 
frm.ShowDialog(); 
登录窗口按下登录按钮后返回用户名密码给主窗体执行验证


我//2.处的代码就是写在FormMain窗体的构造函数中,我也想过你说的这个‘返回用户名密码给主窗体执行验证’,
但验证条件不好写~~比喻说验证不通过,该执行什么语句?我执行return;没有用啊,还会弹出一个空窗体,给人不友好的界面!

#5


引用 3 楼 studylr 的回复:
frm.ShowDialog();就行了。主窗体启东也没有关系,模态的窗体会把焦点获取过来的。只有模态窗体关闭的时候主窗体才能用的 


//FormLogin login = new FormLogin();//2. 
//login.ShowDialog();//2. 

我是showDialog();的~~~看我的代码!

#6


引用 2 楼 SuperTyro 的回复:
  进行判断  如果2个窗体都close 了    就 application.exit() 


我是小菜鸟!  说的不好清见谅,  希望能够帮到你! 


我也这样想过,主入点设置FormLogin(),关闭FormMain()同时关闭整个个程序,但不知道在哪儿怎么写!

#7


在窗体closed的事件里写,application.exit() 就可以关闭整个程序了

#8


做窗体登陆最好用ApplicationContext
http://blog.csdn.net/LeoMaya/archive/2007/07/26/1708214.aspx

#9


我前几天也处理同样的问题,在主窗口打开的时候,我隐藏主窗口

this.Opacity = 0; //设为透明
this.ShowInTaskbar = false;
Login newLogin = new Login(); //实例登陆窗口
newLogin.newmain = this;
newLogin.Show(); //打开登陆窗口

然后在登陆窗口写一个判断,当用户名密码正确时,关闭登陆窗口,进入主窗口,否则在继续在登陆窗口。

DataOperation mydo = new DataOperation();
            string sql = "select * from Xt_admin where Username='" + textBox1.Text.Trim() + "'and Psw='" + GetMd5Str(textBox2.Text.Trim()) + "'";
            string isOk = mydo.GetOledbString(sql);
            if (isOk != null)
            {
                newmain.Opacity = 100;
                newmain.ShowInTaskbar = true;
                newmain.Focus();
                isLoign = true;
                sql = "update Xt_admin set loginCount = loginCount+1 where username = '" + textBox1.Text.Trim() + "'";
                mydo.GetOledbBool(sql);
                this.Close();
            }
            else
            {
                MessageBox.Show("用户名或密码错误!");
                textBox2.Text = "";
                isLoign = false;
            }

#10


引用 7 楼 firehand01 的回复:
在窗体closed的事件里写,application.exit() 就可以关闭整个程序了


Application在窗体里不存在!同理我想通过this.点出隐藏的主窗体,再CLOSE();但找不出来!

#11


引用 8 楼 LeoMaya 的回复:
做窗体登陆最好用ApplicationContext 
http://blog.csdn.net/LeoMaya/archive/2007/07/26/1708214.aspx


太复杂!看了半天看不明白~~~~~555

#12


引用 9 楼 xzf158 的回复:
我前几天也处理同样的问题,在主窗口打开的时候,我隐藏主窗口 

C# code
this.Opacity = 0; //设为透明
this.ShowInTaskbar = false;
Login newLogin = new Login(); //实例登陆窗口
newLogin.newmain = this;
newLogin.Show(); //打开登陆窗口



然后在登陆窗口写一个判断,当用户名密码正确时,关闭登陆窗口,进入主窗口,否则在继续在登陆窗口。 

C# code
DataOperation mydo = new DataOperation();
     …


你的问题好像也没有解决~~看的晕晕的!!

#13


用创建公共类的方法,登录窗体将登录信息传给公共类,然后启动主窗体在构造函数中验证登录信息,
如果错误则抛出异常,整个程序退出,这样应该可以了吧

如下代码:
public class MainClass
{
        public MainClass()
{
}

static void Main() 
{
            //显示登录框
FrmLogin login = new FrmLogin();
            login.ShowDialog();

try
{
                //启动主窗体并执行身份验证
Application.Run(new FrmMain());
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
System.Environment.Exit(0);
}
}

    //公共类,存放用户登录信息
    public class Common
    {
        public static string _loginName;
        public static string _password;

        public Common()
        {
        }
    }

    public class FrmLogin
    {
        public FrmLogin()
        {
        }

        //把用户输入的用户名和密码保存到公共类的静态变量中
        private void SetPersonInfo()
        {
            Common._loginName = 用户名文本框的值;
            Common._password = 密码文本框的值;
        }
    }

    //主窗体
    public class FrmMain
    {
        private string loginName;
        private string password;

        public FrmMain()
        {
            //从公共类中取出元素
            loginName = Common._loginName;
            password = Common._password;

            //CheckAuth是验证登录的方法,通不过返回false
            if (!CheckAuth(loginName, password))
            {
                throw new Exception("用户名或密码错误!");
            }
        }
    }

#14


这么多人回答,我都不想说什么了,不过我看很少有人说到点子上。
建议楼主应用程序主入口写为:
application.run(new frmMain)

在需要登陆的情况下,先用hide方法隐藏主窗体,然后用showdialog方法显示登陆窗体。

最后退出程序的时候,如果程序是单线程的话,可以用application.exit()方法。

如果程序是多线程请先用线程的abort方法终止线程后再用application.exit()方法。

退出的时候最好写成:

try
{
}
catch
{
envirment.exit(envirment.exitcode);//强制结束程序运行
}

这才是一个标准的程序登陆和退出方法。抛砖引玉,仅供参考。

#15


问题已解决,但不知道是不是最合适的方法!我把我的思路及代码发出来给大家看下:
//1.应用程序的主入口点 加了下面的Try....Catch.... (处理直接关闭登录窗体出现的异常)
         [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            try
            {
                Application.Run(new FormCardID());
            }
            catch (Exception)
            {                
                MessageBox.Show("程序已关闭");
            }
            //Application.Run(new FormLogin());
        }

//2.FormLogin()传递一个值TAG给FormMain()
        private void button1_Click(object sender, EventArgs e)
        {
            if (条件)
            {
                this.Tag = "SHOW";
                this.Dispose();
            }
            else
            {
                MessageBox.Show("非法用户,拒绝登录!");
            }
        }

//3.如果FormLogin()直接关闭则TAG为NULL,则直接Close()掉FormMain();
 public partial class FormCardID : Form
    
        public FormCardID()
        {
            FormLogin login = new FormLogin();
            login.ShowDialog();
            if (login.Tag == null)
            {
                this.Dispose(); 
            }
            InitializeComponent();
        }

#16


补充点上面的问题,
              try 
            { 
                Application.Run(new FormCardID()); 
            } 
            catch (Exception) 
            {                
                MessageBox.Show("程序已关闭"); 
            } 
只要new FormCardID()运行中出现异常,都会MessageBox.Show("程序已关闭");
这个异常处理不完善!!!期望大家有更好的解决方法!

#17


引用 14 楼 geaim 的回复:
这么多人回答,我都不想说什么了,不过我看很少有人说到点子上。 
建议楼主应用程序主入口写为: 
application.run(new frmMain) 

在需要登陆的情况下,先用hide方法隐藏主窗体,然后用showdialog方法显示登陆窗体。 

最后退出程序的时候,如果程序是单线程的话,可以用application.exit()方法。 

如果程序是多线程请先用线程的abort方法终止线程后再用application.exit()方法。 

退出的时候最好写成: 



思路是可以,但具体实现呢??

#18


我不是说的很清楚了吗,难道要我把全部代码都写出来。

#1


Application.Run(new FormMain());
在FormMain窗体的构造函数中添加
FormLogin frm = new FormLogin();
frm.ShowDialog();
登录窗口按下登录按钮后返回用户名密码给主窗体执行验证

#2


  进行判断  如果2个窗体都close 了     就 application.exit()


我是小菜鸟!   说的不好清见谅,   希望能够帮到你!

#3


frm.ShowDialog();就行了。主窗体启东也没有关系,模态的窗体会把焦点获取过来的。只有模态窗体关闭的时候主窗体才能用的 

#4


引用 1 楼 kiraqian 的回复:
Application.Run(new FormMain()); 
在FormMain窗体的构造函数中添加 
FormLogin frm = new FormLogin(); 
frm.ShowDialog(); 
登录窗口按下登录按钮后返回用户名密码给主窗体执行验证


我//2.处的代码就是写在FormMain窗体的构造函数中,我也想过你说的这个‘返回用户名密码给主窗体执行验证’,
但验证条件不好写~~比喻说验证不通过,该执行什么语句?我执行return;没有用啊,还会弹出一个空窗体,给人不友好的界面!

#5


引用 3 楼 studylr 的回复:
frm.ShowDialog();就行了。主窗体启东也没有关系,模态的窗体会把焦点获取过来的。只有模态窗体关闭的时候主窗体才能用的 


//FormLogin login = new FormLogin();//2. 
//login.ShowDialog();//2. 

我是showDialog();的~~~看我的代码!

#6


引用 2 楼 SuperTyro 的回复:
  进行判断  如果2个窗体都close 了    就 application.exit() 


我是小菜鸟!  说的不好清见谅,  希望能够帮到你! 


我也这样想过,主入点设置FormLogin(),关闭FormMain()同时关闭整个个程序,但不知道在哪儿怎么写!

#7


在窗体closed的事件里写,application.exit() 就可以关闭整个程序了

#8


做窗体登陆最好用ApplicationContext
http://blog.csdn.net/LeoMaya/archive/2007/07/26/1708214.aspx

#9


我前几天也处理同样的问题,在主窗口打开的时候,我隐藏主窗口

this.Opacity = 0; //设为透明
this.ShowInTaskbar = false;
Login newLogin = new Login(); //实例登陆窗口
newLogin.newmain = this;
newLogin.Show(); //打开登陆窗口

然后在登陆窗口写一个判断,当用户名密码正确时,关闭登陆窗口,进入主窗口,否则在继续在登陆窗口。

DataOperation mydo = new DataOperation();
            string sql = "select * from Xt_admin where Username='" + textBox1.Text.Trim() + "'and Psw='" + GetMd5Str(textBox2.Text.Trim()) + "'";
            string isOk = mydo.GetOledbString(sql);
            if (isOk != null)
            {
                newmain.Opacity = 100;
                newmain.ShowInTaskbar = true;
                newmain.Focus();
                isLoign = true;
                sql = "update Xt_admin set loginCount = loginCount+1 where username = '" + textBox1.Text.Trim() + "'";
                mydo.GetOledbBool(sql);
                this.Close();
            }
            else
            {
                MessageBox.Show("用户名或密码错误!");
                textBox2.Text = "";
                isLoign = false;
            }

#10


引用 7 楼 firehand01 的回复:
在窗体closed的事件里写,application.exit() 就可以关闭整个程序了


Application在窗体里不存在!同理我想通过this.点出隐藏的主窗体,再CLOSE();但找不出来!

#11


引用 8 楼 LeoMaya 的回复:
做窗体登陆最好用ApplicationContext 
http://blog.csdn.net/LeoMaya/archive/2007/07/26/1708214.aspx


太复杂!看了半天看不明白~~~~~555

#12


引用 9 楼 xzf158 的回复:
我前几天也处理同样的问题,在主窗口打开的时候,我隐藏主窗口 

C# code
this.Opacity = 0; //设为透明
this.ShowInTaskbar = false;
Login newLogin = new Login(); //实例登陆窗口
newLogin.newmain = this;
newLogin.Show(); //打开登陆窗口



然后在登陆窗口写一个判断,当用户名密码正确时,关闭登陆窗口,进入主窗口,否则在继续在登陆窗口。 

C# code
DataOperation mydo = new DataOperation();
     …


你的问题好像也没有解决~~看的晕晕的!!

#13


用创建公共类的方法,登录窗体将登录信息传给公共类,然后启动主窗体在构造函数中验证登录信息,
如果错误则抛出异常,整个程序退出,这样应该可以了吧

如下代码:
public class MainClass
{
        public MainClass()
{
}

static void Main() 
{
            //显示登录框
FrmLogin login = new FrmLogin();
            login.ShowDialog();

try
{
                //启动主窗体并执行身份验证
Application.Run(new FrmMain());
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
System.Environment.Exit(0);
}
}

    //公共类,存放用户登录信息
    public class Common
    {
        public static string _loginName;
        public static string _password;

        public Common()
        {
        }
    }

    public class FrmLogin
    {
        public FrmLogin()
        {
        }

        //把用户输入的用户名和密码保存到公共类的静态变量中
        private void SetPersonInfo()
        {
            Common._loginName = 用户名文本框的值;
            Common._password = 密码文本框的值;
        }
    }

    //主窗体
    public class FrmMain
    {
        private string loginName;
        private string password;

        public FrmMain()
        {
            //从公共类中取出元素
            loginName = Common._loginName;
            password = Common._password;

            //CheckAuth是验证登录的方法,通不过返回false
            if (!CheckAuth(loginName, password))
            {
                throw new Exception("用户名或密码错误!");
            }
        }
    }

#14


这么多人回答,我都不想说什么了,不过我看很少有人说到点子上。
建议楼主应用程序主入口写为:
application.run(new frmMain)

在需要登陆的情况下,先用hide方法隐藏主窗体,然后用showdialog方法显示登陆窗体。

最后退出程序的时候,如果程序是单线程的话,可以用application.exit()方法。

如果程序是多线程请先用线程的abort方法终止线程后再用application.exit()方法。

退出的时候最好写成:

try
{
}
catch
{
envirment.exit(envirment.exitcode);//强制结束程序运行
}

这才是一个标准的程序登陆和退出方法。抛砖引玉,仅供参考。

#15


问题已解决,但不知道是不是最合适的方法!我把我的思路及代码发出来给大家看下:
//1.应用程序的主入口点 加了下面的Try....Catch.... (处理直接关闭登录窗体出现的异常)
         [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            try
            {
                Application.Run(new FormCardID());
            }
            catch (Exception)
            {                
                MessageBox.Show("程序已关闭");
            }
            //Application.Run(new FormLogin());
        }

//2.FormLogin()传递一个值TAG给FormMain()
        private void button1_Click(object sender, EventArgs e)
        {
            if (条件)
            {
                this.Tag = "SHOW";
                this.Dispose();
            }
            else
            {
                MessageBox.Show("非法用户,拒绝登录!");
            }
        }

//3.如果FormLogin()直接关闭则TAG为NULL,则直接Close()掉FormMain();
 public partial class FormCardID : Form
    
        public FormCardID()
        {
            FormLogin login = new FormLogin();
            login.ShowDialog();
            if (login.Tag == null)
            {
                this.Dispose(); 
            }
            InitializeComponent();
        }

#16


补充点上面的问题,
              try 
            { 
                Application.Run(new FormCardID()); 
            } 
            catch (Exception) 
            {                
                MessageBox.Show("程序已关闭"); 
            } 
只要new FormCardID()运行中出现异常,都会MessageBox.Show("程序已关闭");
这个异常处理不完善!!!期望大家有更好的解决方法!

#17


引用 14 楼 geaim 的回复:
这么多人回答,我都不想说什么了,不过我看很少有人说到点子上。 
建议楼主应用程序主入口写为: 
application.run(new frmMain) 

在需要登陆的情况下,先用hide方法隐藏主窗体,然后用showdialog方法显示登陆窗体。 

最后退出程序的时候,如果程序是单线程的话,可以用application.exit()方法。 

如果程序是多线程请先用线程的abort方法终止线程后再用application.exit()方法。 

退出的时候最好写成: 



思路是可以,但具体实现呢??

#18


我不是说的很清楚了吗,难道要我把全部代码都写出来。