小弟一直都是做 B/S开发 
这几天心血来潮 想写一写 C/S程序 
一入门就遇到这个问题 我在 登陆窗体体 NEW了 一个新窗体吧新窗体Show了 之后 原来得窗体cLOSE。新NEW得窗体也关闭了  不知道为什么 请指点另求 C/S程序得 设计方法。
比如如何处理 公共得变量 等应该注意得事情  希望大家不吝赐教

解决方案 »

  1.   

    不要用close,用hide,原先的窗体只能隐藏起来不能关闭。
      

  2.   

    在new form后使用this.close;来完成在new form之前把窗体id写在注册表,然后在new form之后检查那里,如果有值就使用api关闭那个窗体,然后把注册表清空。
      

  3.   

    1、要看原窗体是那个窗体了,如果是入口的窗体,则应hide,想要显示时可用Show.
    如果是登陆窗体,在主窗体的Main入口处
    FormLogin frm = new FormLogin();
    frm.ShowDialog();
    if 登陆失败
     关闭窗体
     return
    2、和B/S基本类似,只不过对于状态信息比较容易控制。
      

  4.   

    zhgroup(王员外) 说的对,如果你把main函数放在loginform里的话,那么它就是主窗体,如果你在它里面调用了this.close();你想啊,主窗体都关了,别的呢,皮之不存,毛将焉附!
    建议把loginform作为子窗体,通过主窗体了掉子窗体进行判断
      

  5.   

    问题是我不想HIde  真的没有其他的办法了么?
      

  6.   

    上面已经说清楚了
    如果你不想hide
    那你就在main里面先new这个登陆窗体
    如果登陆成功在run主窗体
    否则关闭
      

  7.   

    一般还是用HIDE吧
    其他的我就不会了
      

  8.   

    #region "Main"
    public ModMain()
    {
    } [STAThreadAttribute]
    static void Main() 
    {
    //异常处理
    Application.ThreadException += new ThreadExceptionEventHandler(MainUIThreadExceptionHandler);            Common.Database.ConnectionString = Get_Info();
    frmLogon frm = new frmLogon();
                frm.txtUser.Text = loginUser;
    if (frm.ShowDialog()==System.Windows.Forms.DialogResult.Cancel)
    {
    return;
    }
                
    System.Windows.Forms.Application.Run(new myMenu());
    }
    #endregion
      

  9.   

    VS默认的WinForm程序模板只有一个程序消息循环,并且入口Form关闭的同时退出程序消息循环,结束程序。开始
     |
     |
    消息循环(入口Form)
     |
     |
    结束
      

  10.   

    可以设计下面的流程开始
     |
     |                    False
    消息循环(登陆Form)---------
     |                          |
     | True                     |
     |                          |
    消息循环(主Form)           |
     |                          |
     |--------------------------
    退出
      

  11.   

    DemoStartApp.cs文件
    /////////////////////////////////////////////////////////////////
    using System;
    using System.Windows.Forms;
    using System.Drawing;
    using System.Text;namespace WinFromDemo
    {
    public class StartApp
    {
    private static bool LoginResult = false; [STAThread]
    static void Main()
    {
    //First Message Loop
    LoginContext loginContext = new StartApp.LoginContext();
    Application.Run(loginContext); if (LoginResult)
    {
    //Second Message Loop
    StartApp.MainContext mainContext = new StartApp.MainContext();
    Application.Run(mainContext);
    }
    } public class LoginContext : ApplicationContext 
    {
    private LoginDialog loginDialog; public LoginContext() 
    {
    loginDialog = new LoginDialog();
    loginDialog.StartPosition = FormStartPosition.CenterScreen;
    loginDialog.Closed += new EventHandler(OnFormClosed);            
    loginDialog.Show();
    } private void OnFormClosed(object sender, EventArgs e) 
    {
    LoginResult = !(this.loginDialog.DialogResult == DialogResult.Cancel); ExitThread();
    }
    } public class MainContext : ApplicationContext 
    {
    private Form mainForm; public MainContext() 
    {
    mainForm = new Form();
    mainForm.StartPosition =  FormStartPosition.CenterScreen;
    mainForm.Closed += new EventHandler(OnFormClosed);            
    mainForm.Show();
    } private void OnFormClosed(object sender, EventArgs e) 
    {
    ExitThread();
    }
    }
    }
    }
      

  12.   

    http://blog.csdn.net/Knight94/archive/2006/08/22/1104957.aspx
      

  13.   

    新窗体是在原窗体基础上建立起来的,不能关闭原窗体只能隐藏.要想处理全局变量,建议采用Static变量
      

  14.   

    我觉得还是
     开启---登陆画面/显示主窗体默认界面---用showdialog显示登陆---判断返回值初始权限
    这样比较好
    把应用程序加载放到启动画面去
    这种更适合比较大的系统,不同的模块不同的用户权限
      

  15.   

    ShowDialog();方法才是正解.Button1_Click()
    {xxxForm frm = new xxxForm();
    frm.ShowDialog();}
      

  16.   

    http://www.cnblogs.com/KissKnife/archive/2006/09/10/500158.html
      

  17.   

    #region "Main"
    public ModMain()
    {
    }[STAThreadAttribute]
    static void Main() 
    {
    //异常处理
    Application.ThreadException += new ThreadExceptionEventHandler(MainUIThreadExceptionHandler);            Common.Database.ConnectionString = Get_Info();
    frmLogon frm = new frmLogon();
                frm.txtUser.Text = loginUser;
    if (frm.ShowDialog()==System.Windows.Forms.DialogResult.Cancel)
    {
    return;
    }
                
    System.Windows.Forms.Application.Run(new myMenu());
    }
    #endregion
      

  18.   

    接上面,你可以把主界面作为启动窗体,然后在主界面未显示出来前,先显示登录窗体,登录成功再显示主窗体,登录不成功,直接退出,直接在form的load事件中写就好了
      

  19.   

    逻辑问题
    main()
    {
       loginform lf = new loginform();
       if(lf.Showdialog() == DialogResult.OK)
       {
         mainform mf = new mainform();
         mf.show();
       }
    }
    这样根据不存在谁打开谁
      

  20.   

    zhgroup(王员外) ( ) 信誉:99    Blog 
    正解
      

  21.   

    if (this.ActiveMdiChild!=null)
    {
    this.ActiveMdiChild.Close(); //关闭已经打开的子窗体
    } InSchool child_InSchool=new InSchool();
    child_InSchool.MdiParent=this;//this表示本窗体为其父窗体
    child_InSchool.Show();
      

  22.   

    lz:一个很简单的办法(刚好前几天解决的):
         你在原来的窗体设置一个public bool bNew=false;的变量,在你要new新窗体的地方改成如下代码:
         bNew=true;
         this.Close();
         //原来窗体消失了,但它的类作用域并没有消失
       
    然后在你原来定义、使用原窗体变量的地方,即frmOld.ShowDialog();之后:
        if(frmOld.bNew)
        {
            NewForm frmNew=new NewForm ();
            frmNew.ShowDialog();
        } 
    问题就搞定了