winform程序中,我想实现如下的效果:当程序开始运行的时候,登录界面与主窗体界面同时显示,并且登陆界面在主界面之上;我写的程序如下所示,效果是达到了,但是有一个问题,登录成功之后我无法将用户信息传到主界面,
说明: frmMain 为主窗体;frmUserLogin为登陆窗体,
我的思路是这样的:
1.首先在program.cs文件中设置应用程序的启动窗体frmMain,代码如下:
 static class Program
    {
        /// <summary>
        /// 应用程序的主入口点。
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new frmMain());
        }
    }
2.然后在frmMain的load事件中,实例化一个frmUserLogin对象,并将它show出来,代码如下:
            frmUserLogin logon = new frmUserLogin();
            logon.MdiParent = this;
            logon.Show();
3。通过上面两步,好象就已经达到我想得到的运行效果,即主窗体在下,登陆窗体在上。
问题就在下面:我在frmUserLogin界面上定义了两个buttion按钮,buttion1为"登入",button2为"取消",
登入按钮的click事件定义如下:
private void button1_Click(object sender, EventArgs e)

  首先对用户名和密码进行判断,代码我在此省略,要说明的是,在我的项目中
已经定义了一个用户类,下面的userLogin其实是用户类的一个对象,ds是一个dataset类的实例,它里面的内容是通过查询用户名和密码之后填充的,我现在的问题就是想把这个userLogin传送到frmMain窗体,因为在frmMain 中我已经实例化了一个Users 类的对象globalUser,我不知道怎么把这里的userLogin对象传给frmMain中的globalUser对象
  if(验证成功)
 {
   userLogin.username=txtName.text;
   userLogin.userpwd=txtPwd.text;
   userLogin.dept=ds.tables[0].rows[0]["dept"].tostring();
   Form frm = this.MdiParent;
   frm.globaluser=userLogin  ???? 好像frm根本就没有globaluser....这句话肯定有错,不知道怎么去写
   this.Close();
                }
}
  

解决方案 »

  1.   

    写一个公共类,里面写public static frmUserLogin frmLogin ;然后在你登录的load里面写上,
    frmUserLogin logon = new frmUserLogin(); 
    logon.MdiParent = this; 
    类名.frmLogin = logon;
    logon.Show(); 然后你验证的时候,直接用 类名.frmLogin.globaluser来做了
      

  2.   

    可不可以把类里的先传给一个dataset  让后通过dataset给窗体
      

  3.   

    把结构改一下
    static void Main() 
    {    UserLogin frm = new UserLogin();    // 验证窗体内 成功则执行 this.DialogResult=DialogResult.OK  默认返回DialogResult.Cancel
       if (frm.ShowDialog() == DialogResult.Cancel)
       { 
           Application.Exit(); return;
       }   Application.Run(new frmMain()); 
    }
      

  4.   

    方法有许多种。
    你可以重载frmUserLogin的构造函数
    private Users localUser;
    public frmUserLogin(ref Users globalUser)
    {
       this.localUser = globalUser;
    }
    在frmMain_Load中
    frmUserLogin logon = new frmUserLogin(this.globalUser); 
    logon.MdiParent = this; 
    logon.Show(); 当然,你最好是两个窗体的namespace都指定成一个,这样把Users类定义在相同的namespace中。
      

  5.   

    写个公共类,
    winfrom 中传值应该很方便的
      

  6.   

    你的思维还局限在做web程序上。winform是一个整体,应该说不存在传值的问题。
      

  7.   

    有很多的处理方法.在这里就改改你的代码吧:frm.globaluser=userLogin  不知道如何写是吧.frm.globaluser=userlogin.username这样写就可以.
    还有你的"frm.globaluser=userLogin  ???? 好像frm根本就没有globaluser....这句话肯定有错,不知道怎么去写 
    "放在主页面载入事件里的对话框关闭之后写
    即然你写了用户类(userlogin)那么整个应该程序运行时的数据传递都可以通过此类来进行.
      

  8.   


    //教你个简单的//登录窗体类 传递一个登录对象实体类 //在父窗体 new子窗体并显示的时候 传递一个空的对象实体类进去//当子窗体登录成功后 记录登录信息到实体类 然后关闭子窗体//当父窗体结束了对子窗体显示的时候 察看实体类是否为空 //然后。
      

  9.   

    结构改下 在login窗体提供 登陆信息的属性 再logon.Show(); 改成ShowDialog();在这句后面
    取Login.属性.
      

  10.   


    用户验证,是必备界面,在以前反复比对过包括楼上提过的其他的用法,解释一下这种用法的好处:
    (1)登录验证在先,如果通不过不用加载比较复杂的主界面,响应速度快。
    (2)验证通过后,不占用资源,自动释放掉了。
    (3)用窗体固有的状态值DialogResult传递是否登录成功的信息,不用增加全局变量(属性)。
      

  11.   

    窗体构造函数传递:
    首先把登陆窗口中的需要的变量声明为静态的。
    public frmMain(form f)
    {
        f.变量1=x;
    }
      

  12.   

    Winform程序做的太少了,向楼主们学习