zoukankan      html  css  js  c++  java
  • 窗体之间传递参数总结

    方案一: 窗体属于类,可以在窗体类中定义已全局变量,类型为公开、静态的。
    示例: public static string str ="";
           注意是静态变量,如果为:
           public string str = "";
           可能会出现问题,非静态变量只能实例化对象后,才可以访问,如果该值为动态赋值的话,当别的窗口调用的时候,该值 str,一直是为"";所以说最好能设置为静态成员变量,用类来访问它。
     
    方案二:在窗体类中定义构造函数,意思就是说,如果form1要用到form2的一个变量,则要在form1中定义一个构造函数:
    public Form1(string str)
    {
       //在实例化form1的时候,传递str参数过来,最后调用该参数即可
    }
    个人认为,此方法是在form2中创建form1的时候调用最合适,反过来,form1如果是个主窗口,则此方案不是最好。
     
    方案三:通过事件来传递参数
    事件机制一直是很难理解,比如开会,安排会议,首先要选择开会时间,地点等因素(定义事件),然后可能通过电话,邮件方式通知大家(事件发布),另外一方一旦收到,会按照先前设置的开会时间,地点来参加会议(事件响应),大概事件就是要通过三个步骤完成:
    第一步:定义委托:  public delegate void Mydelegate(string str)//参数str根据情况来定
    第二步:声明事件变量:public event mydelegate MyEvent;
    第三步:发布事件,这个是由声明者来做的,定义一个激发事件函数
    比如说:
    public void Handle()
    {
       MyEvent(str);
    }
    最后:事件接受者可以订阅事件 
       xx.MyEvent += new MyDelegate(事件处理函数,有接受者定义)
       xx.Handle();
    //一般操作是在 "+="后面按tab键,.net平台会自动给你生成一个处理函数,比如说下面的处理函数:
    void xx_MyDelegate(string str)
    {
     //参数str是发布者传递过来的参数,会议召开时间、地点等信息;
      //处理代码
     
    示例代码:
    窗口一:
    using System;
    using System.Windows.Forms;
    namespace Test_Event
    {
        public partial class Form1 : Form
        {
            //Form1构造函数
            public Form1()
            {
                InitializeComponent();
            }
            public static string str = "";
            private void button1_Click(object sender, EventArgs e)
            {
                str = this.textBox1.Text;
                Form2 f2 = new Form2();
                f2.Show();
                f2.myevent += new Form2.dd(f2_myevent);//订阅事件
               // f2.hand();                             //激发函数
            }
            void f2_myevent(string str)
            {
                this.textBox1.Text = str;
            }
        }
    }
      窗口二:
     
    using System;
    using System.Windows.Forms;
    namespace Test_Event
    {
        public partial class Form2 : Form
              public Form2()
            {
                InitializeComponent();           
            }
            public delegate void dd(string str);//定义委托
            public event dd myevent;            //事件变量
            //事件激发函数
            public void hand()
            {
                myevent(this.textBox1.Text);
            }
            private void button1_Click(object sender, EventArgs e)
            {
                //hand();
                this.Close();
            }
            private void Form2_Load(object sender, EventArgs e)
            {
                this.textBox1.Text = Form1.str;
            }
        }
    }



    首先创建一个父窗体form1,拥有一下控件:textBox1,button1;
    再创建一个子窗体form2,拥有控件:textBox2,button2;
    (首先描述一下整个过程:当点击form1的button1时,打开form2窗口,然后在textBox2里面输入任意值,当点击button2时,将textBox2的值传给textBox1,即实现窗体间传值)
     
    第一种方法:
    在button1的单击事件中写入如下代码:
    form2 f2 = new form2();
    f2.ShowDialog(this);
     
    在button2的单击事件中写入如下代码:
    form1 f1 = (form1)this.owner;
    f1.textBox1.text =this.textBox2.text;
    运行即可实现传值。
     
     
    第二种方法:
    在button1的单击事件中写入如下代码:
    form2 f2 = new form2(this);
    f2.ShowDialog();
     
    在窗体form2的窗体类中声明变量,并改写初始化构造函数如下:
    form1 form1;
    public form2(form1 f1)
    {
    InitializeComponent();
    form1 = f1;
    }
     
    在button1的点击事件中写入如下代码:
    form1.textBox1.text = this.textBox2.text;
    运行即可实现传值。
     
    注:textbox1的Modifiers(控件的可见性级别,即修饰符)应为:public ,internal,protected中之一,不能为private(私有)。
  • 相关阅读:
    mac下完全卸载程序的方法
    Mac下检测NSTableView的滑动事件的方法
    一行代码起动全屏
    Unsupported compiler '4.0' selected for architecture 'i386'类错误解决办法
    编译错误“The run destination My Mac 64bit is not valid for Running the scheme '***',解决办法
    ios项目中导入百度地图SDK出错的问题
    Unable to resolve target 'android9'解决办法
    ios保存录制好的视频到相簿的方法
    NSTableView系列之代码创建(不用nib)
    谈内链优化不是每个站点都能做的
  • 原文地址:https://www.cnblogs.com/xiaofengfeng/p/2136993.html
Copyright © 2011-2022 走看看