zqwuwei的技术博客

理论指导实践,在实践中更好的理解理论
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

[转]浅析form传值

Posted on 2007-11-21 09:11  zqwuwei  阅读(413)  评论(0编辑  收藏  举报
一.先说废话
一般的工程都是多个form组成的,各个窗体之间经常要灵活的传递数据。鉴于经常有同学问及窗体传值的问题,我也刚好在做Mobile设备上的一个多窗体应用,就写篇弱文与大家分享。
二.正文
窗体传值的方法有很多,下面仅介绍我用过的一些,不知道官方叫这些什么方法,大家也可以找找看其他的。
1. 通过构造器传值
这是最简单的一种方式,例如我从form1中要传一个字符串去form2
首先,在form2的构造器中稍作修改:
        public Form2(String s)
        {
            InitializeComponent();
            this.labelRecieve.Text = s;
    }
  添加了一个string参数 s
然后,在form1的click事件中,将要传递的参数传入,如下片断:
        private void buttonShow_Click(object sender, EventArgs e)
        {
            …
            Form2 f2;
            if (textBoxSend.Text == "")
            {
                f2 = new Form2("I'm from form1");
            }
            else
            {
                f2 = new Form2(textBoxSend.Text);
      }
       DialogResult r = f2.ShowDialog();//至于Show与ShowDialog就不用再说了吧

}
在触发click事件的时候,form2就接受到f1传过去的textBoxSend.Text或者"I'm from form1",并且用labelRecieve去承接它。
这种方法,虽然简单方便,但是毕竟功能有限,当需要传递较大量的多样的数据时,用构造器就不能胜任了。
2. 通过属性传递
属性可以方便的传递多个数据(不就是添加多个属性么?),假设我要从form2传递某字符串到form3,首先我们为form3添加一个属性叫myString
        public Form3()
        {
            InitializeComponent();
        }
        public string myString
        {
            get
            {
                return this.textBoxf3.Text;
            }
            set
            {
                if (value == null)
                    textBoxf3.Text = string.Empty;
                else
                    textBoxf3.Text = value;
            }
   }
通过该属性去设置文本框的text.
然后,在form2的点击事件中,只需令
      f3.myString = "I'm from form2";
      这样也很方便,值得一提的是,这样通过属性传递的时候,即可以将数据从form2船到form3又可以从form3传回来。如
            if (r == DialogResult.OK)
            {
                f3.myString = "I'm from form3";
                this.labelRecieve.Text = f3.myString;
//form3关闭的时候将myString保存到form2的label中。
            }
        属性传递是最常用的一种方式。
3.  通过事件携带参数传递
坦白说,我目前还很少用到这,最初是在MacintoshM给我的书上看到的。其实准确的说这个应该叫事件结合属性传值。
现在我在form4里面坐了某些操作,假设form4是我们开发的类型库的一部分,我想将它发布给其他的同事使用的时候,我们可以使用这样的事件去传值。
首先,在form4中,添加事件参数类型和事件处理器委托的定义:
       public class myEventArgs : EventArgs
        {
            string myString;
            public string MyString
            {
                get
                {
                    return myString;
                }
                set
                {
                    if (value != null)
                        myString = value;
                    else
                        myString = string.Empty;
                }
            }
 
            public myEventArgs(string s)
            {
                this.MyString = s;
            }
        }
 
//事件处理方法的委托
        public delegate void myEventHandler(object sender, myEventArgs e);
然后,我们在click事件中去触发这样一个公共的事件myClick
        public event myEventHandler myClick;
 
        private void buttonClick_Click(object sender, EventArgs e)
        {
            if (this.myClick != null)
                this.myClick(this,new myEventArgs(textBox4.Text));
            this.DialogResult = DialogResult.OK;
    }
我们将textBox4中的文本封装到myEventArgs这样一个事件参数对象里面,这样它就会随着事件被传到form3中,同时在form3中我们来添加一个事件处理方法,
        void f4_myClick(object sender, Form4.myEventArgs e)
        {
            myString = e.MyString;
            this.textBoxf3.Text = String.Format("From f4: {0}",e.MyString);
        }    
   在点击事件中我们通过委托去调用该方法
   Form4 f4 = new Form4();
   f4.myClick += new Form4.myEventHandler(f4_myClick);
 
在f4对象的myClick事件被触发以后,会调用这里的f4_myClick方法,我们就可以通过该方法从事件参数中取得数据了,这里是放到textBoxf3中。