c#多个窗体之间传值

多个窗体传值,就是把一个窗体中的值通过某种方式传递给另一个窗体,如把A窗体的一个textbox中的字符串(但不限于字符串,简单起见,只展示一个字符串),传递给另一个窗体B的textbox(接受字符串)。个人知道的有两种方式,下面分别介绍:

方式(一):利用静态字段进行传递
原理就是:在项目中,除了2个窗体之外,再另建一个公共的类,里面包含需要进行传递的数据的类型的一个静态字段,把这个静态字段当做全局变量,在调用B窗体之前,把A中要进行传递的数据写入建立的公共类的静态字段,并保存,在调用B窗体时,B窗体会从公共类的保存传递数据的静态字段之中读取出该数据,从而达到数据传递的目的.

    示例:建立一个项目,DataPassByStaticField如下所示:

c#多个窗体之间传值_第1张图片

项目建立之后,自动插入了一个窗体,更改它的Text属性,把Form1更改为A,如下所示:

c#多个窗体之间传值_第2张图片

c#多个窗体之间传值_第3张图片

加入一个textbox控件,用来传递一个字符串,一个button,用来调用接收传递字符串的窗体;把button控件的text属性更改为“显示B窗体”,textbox控件的属性可以保持默认,一个Label控件用来做个说明,更改label控件的text属性为“传递的字符串”:

c#多个窗体之间传值_第4张图片

在项目中,在插入一个窗体B,添加一个textbox用来接收传递过来的字符串。一个label用来做说明,更改它的text属性为“接收的字符串”,其它属性保持默认即可。选择 项目>添加windows窗体

c#多个窗体之间传值_第5张图片

c#多个窗体之间传值_第6张图片

最后在项目中添加一个公共的类,里面包含一个静态的字段passData,用来在A和B窗体之间传数据的中转。

c#多个窗体之间传值_第7张图片

下面进行代码的编写:
对GlobalData.cs中,定义一个静态字段,用于存储要传递的数据

namespace DataPassByStaticField
{
    class GlobalData
    {
        public static string passData;
    }
}

对窗体A的button的Click事件进行处理

namespace DataPassByStaticField
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            GlobalData.passData = textBox1.Text;//保存传递的字符串

            From myForm = new Form2();//构建B窗体的一个实例
            myForm.ShowDialog();//显示B窗体
        }
    }
}


对窗体B窗体载入事件进行处理


``
namespace DataPassByStaticField
{
    public partial class Form2 : Form
    {
        public Form2()
        {
            InitializeComponent();
        }

        private void Form2_Load(object sender, EventArgs e)
        {
            textBox1.Text = GlobalData.passData;//从GlobalData中读取数据
        }
    }
}


测试结果:
![这里写图片描述](http://img.blog.csdn.net/20170625165531788?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvYnVsbHplcm9uZQ==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)



方式二:通过构造函数进行数据的传递
原理:如果想要把A窗体中的数据传递到B窗体,可以修改B窗体的构造函数,把将要传递的数据作为B窗体的构造函数的形参,之后,在A窗体中调用B窗体时,将需要传递的数据作为实参传递给B窗体的构造函数,从而达到数据传递的目的。

测试项目和上面所说的一样,修改一下代码即可:

注释掉GlobalData类。

namespace DataPassByStaticField
{
/* class GlobalData
{
public static string passData;
}*/
}


修改A窗体的button控件的Click事件:

namespace DataPassByStaticField
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

    private void button1_Click(object sender, EventArgs e)
    {
        /*
        GlobalData.passData = textBox1.Text;

        Form myForm = new Form2();
        myForm.ShowDialog();
        */
        string passData = textBox1.Text;

        Form myForm = new Form2(passData);//调用B的构造函数的时候,进行数据传递
        myForm.ShowDialog();//显示B窗体
    }
}

}


修改窗体B的构造函数,增加一个字符串形参;增加一个字段 用来存储数据

namespace DataPassByStaticField
{
public partial class Form2 : Form
{
string ReceiveData;//一个字段,保存数据
public Form2(string ReceiveStr)//修改构造函数,增加一个字符串形参
{
InitializeComponent();
ReceiveData = ReceiveStr;
}

    private void Form2_Load(object sender, EventArgs e)
    {
        /*
        textBox1.Text = GlobalData.passData;
        */

        textBox1.Text = ReceiveData;
    }
}

}
“`

测试结果和上例一样

c#多个窗体之间传值_第8张图片

你可能感兴趣的:(C#)