我这是一个登录框,在登录成功之后,要把登录框隐藏,显示主窗体,就像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());这一句出了问题。

解决方案 »

  1.   

    用这个试试?
     [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();
            }
      

  2.   

    你的登录成功的时间怎么是点击btnCancel_Click
    好好检查你的代码这是完全没问题的
              this.Hide();
                frmMain frmmain = new frmMain();
                frmmain.Show();
      

  3.   

    当然是
    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());
      

  4.   

    应该第一个方法没有问题的啊。Application.Run(new frmLogin());这句是用来开始启动的第一个窗口用的,跟这句没有什么关系吧。
      

  5.   

    为什么要隐藏。
    直接关啊
    共同学习
    http://topic.csdn.net/u/20100810/11/8eadaeda-046b-4bc6-8bf4-18c030c52a18.html
      

  6.   

    你不关的原因就是在this。Close()时,关闭了程序
    而我引用的帖子中那位仁兄给的代码可以解决问题。
      

  7.   

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

  8.   


    btnOK_Click里面的代码太长,又是连接数据库又是提交验证的,所以写在btnCancel_Click里面,当作是测试代码,我在其他窗体试过,没问题,唯独这个登录框出错,他加载了两次,我也找不到原因。
      

  9.   

     static void Main()
      {
      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(); 
      

  10.   


    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块后面的语句根本执行不到,就是不停的弹出新窗口出来。
      

  11.   

     [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();
      }找不到User32.dll文件
      

  12.   

    private void btnCancel_Click(object sender, EventArgs e)
    {
        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();
    }
      

  13.   

    lz,问题就是出在了Application.Run()上面,其实你没必要非得在Application.Run里面加new frmLogin() 具体可以如下这样做的frmLogin frmlogin = new frmLogin();
    frmlogin.show();
    Application.Run();然后其他操作可以保留原样
      

  14.   

    如何用C#写一个简单的Login窗口
      

  15.   

    你尝试一下在“Main()”上面加上“[STAThread]”看看:[STAThread]
    static void Main() 
    {
    //...
    }
      

  16.   

    主窗口与登陆窗口的关系是很微妙的,很多人喜欢把login窗口做为主窗口,main窗口做为子窗口,这样就会造成要隐藏login窗口的举动,另外在dispose还会带来鸡生蛋,蛋生鸡的问题.
    我在大部分情况下,是以main做为主窗体,new 出login,login中可以用事件触发父窗体事件,比如登陆成功,取消,而main窗体的隐藏,往往要通过设置main窗体透明度(opatity)属性为0,登陆成功后回设为1来实现.
      

  17.   

    往往要通过设置main窗体透明度(opatity)属性为0,登陆成功后回设为1来实现................你这方法,第一次见啊,挺有创意的,如果登录时用户选择退出怎么办?Application.Exit?好象在1.0时,这种粗暴的退出方式很管用,2.0以后,就不是那么管用了,麻烦事越来越多,因为2.0的两个在窗口关闭的两个事件(实际上是三个,有一个不让人用)会被触发,而微软又把两个旧事件弄过时了,所以更多的人使用的新事件,但却用旧事件处理问题的方法去处理问题,所以导致流行很久的Hide方案出了越来越多的问题.一般来说,主窗口需要处理的事很多,包括许多静态变量的初始化和保存问题等等.在主窗口中Show出一个登录窗口,流程控制的难度可能会更大,应该好好研究一下再决定是否采用.再说说Hide方案,别的不考虑,光这个窗口占着茅坑...就够让人垢病的了,特别是有人还想在程序退出前干点保存之类的事时,还不得不去请示这位传说中万历皇帝.17楼所述的:
    Login lg = new Login();//该窗体为登录窗体
      if (lg.ShowDialog() == DialogResult.OK)
      {
      Application.Run(new MDIMain());//运行主窗体(MDIMain())
      }
    这种方法,还是弹性比较好的,在某种程度上不会带来更多的复杂性,需要反复登录的话,把if改为while就可以了.还有一个特殊情况就是程序干脆没有主窗口,即VB那种最后一个窗口关闭才退出(搞过VB的人容易带来这种需求),那就需要自定义ApplicationContext,并在Application中Run这个appContext了
      

  18.   

    你这方法,第一次见啊,挺有创意的,如果登录时用户选择退出怎么办?Application.Exit?好象在1.0时....请指教..
    我的做法是
    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();
                   }
                }
            }
        }
    }