有四个窗口FrmLogin(登陆窗口) ,FrmMain(主窗口),FrmBillManager(单据管理窗口),FrmBillAdd(单据增加窗口)在 登陆窗口 FrmLogin 中,取得用户的资料比喻:用户ID,用户名称等,这些资料要传到几个不同的窗口:主窗口,单据管理窗口,单据增加窗口用户的资料对象模型为:UserInfo model=new UserInfo();我的做法是这样子:
首先在 登陆窗口, 主窗口,单据管理窗口,单据增加窗口 这几个窗口分别定义一个 用户的资料对象模型model 的变量。登陆窗口:
FrmLogin fm=new FrmLogin();
fm.show();主窗口中接收登陆窗口的model值
FrmMain fm=new FrmMain();
 fm.model  =this.model ;单据管理窗口 接收主窗口的model值
FrmBillManager fm=new FrmBillManager()
 fm.model  =this.model ;单据增加窗口 接收单据管理窗口 model值
FrmBillAdd fm=new FrmBillAdd();
 fm.model  =this.model 就这样,我终于可以把这个对象传到各个需要的窗体中去。 在实际项目中,还有哪些更好的办法呢,请指教!

解决方案 »

  1.   

    using System;
    using System.Windows.Forms;namespace WindowsApplication15
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
           
            void frm_KeyDown(object sender, KeyEventArgs e)
            {
                Form frm = sender as Form;
                Form parent = frm.Tag as Form;
                parent.Text = e.KeyCode.ToString();
            }        private void button1_Click(object sender, EventArgs e)
            {
                Form frm = new Form();
                frm.Tag = this;
                frm.Text = "请按任意键...";
                frm.Show();
                frm.KeyDown += new KeyEventHandler(frm_KeyDown);
            }
     
        }
    }
      

  2.   

    每个窗体里都加个 EventHandle并且是public的,并加上处理方法
    然后让他们互相调用。
      

  3.   

    登录窗体代码:   /// <summary>
            /// 调用显示form2
            /// </summary>
            /// <param name="sender"></param>
            /// <param name="e"></param>
            private void button1_Click(object sender, EventArgs e)
            {
                 Form2 f2 = new Form2(22,"管理员");
                 f2.Show();        }
      

  4.   

    显示内容窗体代码: public partial class Form2 : Form
        {
            int userid;
            string username = string.Empty;
            public Form2(int userid,string username)
            {
                this.userid = userid;
                this.username = username;
                InitializeComponent();
            } private void Form2_Load(object sender, EventArgs e)
            {
                label1.Text = this.userid.ToString();
                label2.Text = this.username;
            }
        }
      

  5.   


    1.通过构造函数
    特点:传值是单向的(不可以互相传值),实现简单
    实现代码如下:
    在窗体Form2中       
            int value1;
            string value2;
            public Form2(int value1, string value2)
            {
                InitializeComponent();
                this.value1 = value1;
                this.value2 = value2;
            }
    在窗体Form1中这样调用 
    new Form2 ( 111 , "222" ).Show ( );  //这样就把111,"222",这2个值传送给了Form2
     
    2.通过静态变量
    特点:传值是双向的,实现简单
    实现代码如下:
    在一个app类中定义一个静态成员value
            public class app
            {
                public static string value;
            }
    在窗体Form1中这样调用 
    app.value = "f2";        //给静态成员赋值
    new Form2 ( ).Show ( );  //显示Form2
    在窗体Form2中      
    this.Text = app.value;  //取回app.value的值
    app.value = "Form2";    //给app.value赋值,以便其他窗体调用
     
    3.通过窗体的公有属性值
    特点:实现简单
    实现代码如下:
    在窗体Form2中定义一个公有属性Form2Value,获取和设置textBox1的文本值
            public string Form2Value
            {
                get
                {
                    return this.textBox1.Text;
                }
                set
                {
                    this.textBox1.Text = value;
                }
            }
    在窗体Form1中这样调用 
    Form2 f2 = new Form2 ( );
    f2.Form2Value = "Ok";     //给Form2的textBox1赋值Ok
    f2.ShowDialog (  );
     
    4.通过窗体的公有属性值和Owner属性
    特点:实现简单,灵活
    实现代码如下:
    在窗体Form1中
            public int Form1Value = 1;
            Form2 f2 = new Form2();   //把Form1作为Form2的所有者传递给Form2
            f2.ShowDialog(this);
    在窗体Form2中
    //Form2的所有者是Form1
    Form1 f1 = ( Form1 ) this.Owner;
    //取到Form1的值是1
    MessageBox.Show ( f1.Form1Value .ToString ( ) );
    //给Form1的Form1Value赋值222
    f1.Form1Value = 222;
     
    5.通过窗体的公有属性值和Application.OpenForms属性 
    说明:Application.OpenForms属性:获取属于应用程序的打开窗体的集合。(此属性在 .NET Framework2.0版中)
    实现代码如下:
    在窗体Form1中
    public int Form1Value = 1;
    Form2 f2 = new Form2 ( );
    f2.Show ( );
    在窗体Form2中
    string formName = "Form1";
    Form fr = Application.OpenForms [ formName ];
    if ( fr != null )
    {
        Form1 f1 = ( Form1 ) fr;
        //取到Form1的值是1
        MessageBox.Show ( f1.Form1Value.ToString ( ) );
        //给Form1的Form1Value赋值222
        f1.Form1Value = 222;
    }
     
    6.通过事件
    实现代码如下:
    在窗体Form2中定义公有属性Form2Value,获取和设置textBox1的文本值
    并且还定义一个accept事件
    public string Form2Value
    {
        get
        {
            return this.textBox1.Text;
        }
        set
        {
            this.textBox1.Text = value;
        }
    }
    public event EventHandler accept;
          
    private void button1_Click ( object sender , EventArgs e )
    {
        if ( accept != null )
        {
            accept ( this , EventArgs.Empty );  //当窗体触发事件,传递自身引用
        }
    }
    在窗体Form1中
    Form2 f2 = new Form2 ( );
    f2.accept += new EventHandler ( f2_accept );
    f2.Show ( );
    void f2_accept ( object sender , EventArgs e )
    {
     //事件的接收者通过一个简单的类型转换得到Form2的引用
        Form2 f2 = (Form2) sender;
     //接收到Form2的textBox1.Text
        this.textBox1.Text = f2.Form2Value; 
    }
      

  6.   

    通过Panel来实现!可以控制样式可以设置美观
      

  7.   

    http://topic.csdn.net/u/20110407/19/c1068d69-7331-4d02-bc0b-f5ba7a5f8dd8.html
      

  8.   

    http://download.csdn.net/source/3466262
      

  9.   

    用户的资料对象模型为:UserInfo model=new UserInfo();
    要把 model 对象模型 传给各个窗口,要这样做:
    From1 fm= new From1(model)From2 fm= new From2(model)From3 fm= new From3(model)From4 fm= new From4(model)
    ……
    这样第一个传给第二个,第二个传给第三个,第三个传给第四个……比喻说要增加多一个变量什么的,那么必须对 from1,from2,from3,from4 进行修改。很是麻烦啊!
    有没有更好的解决思路?