关于在窗体之间传值的问题 C# winform

做c/s项目已经有段时间了  两个月了吧   

经常会被Form A 和Form B窗体间互相传值 困扰

最近在做及时查询(用小的查询框 快速查取编码)     通过在网上的查找  总结出了以下几种方式可以实现

1全局变量 2属性 3 窗体构造函数 4用委托 5用委托加事件的方法

1 全局变量 

这个最简单,只要把变量 定义为    static 就可以了  

缺点是     静态变量比较危险,总之我一开始就想过这种方法,但是始终没有用过...(担心被老大骂,要是在学校的课程设计,果断这样弄好了)

在Form A 中定义一个static 变量

 public static  int  i =9;

然后在 FormB 中 的按钮事件下:

private void button1_clic(object sender,system.Event Args)

{

textBox1.Text=Form.i;

}

2利用属性来传值

他的核心思想是这样的

将类作为一个参数 传进构造函数中 ,由于类是引用类型     在B中    定义一个类的实体,将这个参数赋值给它

这样   这两个类(具有string 属性的)就指向了同一个地址。这时在FormB,FormA  就拥有了   一块共同使用的地址

详情可参见

http://blog.csdn.net/tjvictor/article/details/772711

3利用窗体构造函数传值

这个的意思就是   将需要传的值    放在构造函数的参数中  

传给新的窗体类  

缺点是单向的      也就是 只能 parent 窗体 给  子窗体 传值   

4 利用委托传值  

这个最早是彭斌跟我讲的  

但是一直  对于高级编程的东西 不太熟悉  不知道怎么写 

于是彭斌给我写了一个   委托加事件的    在这里 又从网上找了到了  纯委托的东西

FormB中先定义一个delegate

Public delegate void returnvalue (int i);

public returnvalue Return;

然后在FormB中的Button 中写下如下

private void button1_Click (object sender,System.EventArgs e)

{

if(ReturnValue !=null)

ReturnValue(8);

}

----------------------------------------------------------------

Form 1中的button 按钮如下:

private void button1_Click(object  sender,System.EventArgs e)

{

Form2 temp =new Form2();

temp.ReturnValue  = new temp.Form2.returnvalue(showvalue);

temp.Show;

}

private void  showvalue(int i)

{

textBox1.Text=i.Tostring();

}

点击form B的button ,formA的textbox 中的值就会相应的变化。

5用委托加事件的方法

下边是彭斌的代码

Form2 中

        public event SelectedKeyValueHander SelectedKeyValue;

        private void button1_click(object sender, DataGridViewCellMouseEventArgs e)
        {
            _text = dgvList.Rows[e.RowIndex].Cells["colCode"].Value.ToString();
            if (SelectedKeyValue != null)
                SelectedKeyValue(new KeyValue() { Value = _text });
            HostForm.DialogResult = DialogResult.OK;
        }

-----放在form 2的同命名空间下

    public class KeyValue : EventArgs
    {
        public string Value { get; set; }
        public KeyValue() { }
    }
    public delegate void SelectedKeyValueHander(KeyValue args);

然后再form 1 的下边写上

 private void button1_click(object sender, DataGridViewCellMouseEventArgs e)
{

KeyValueList KVL = new KeyValueList(3);//KVL是我做的窗体

                if (KVL.NavigatedDialog() == DialogResult.OK) ;//如果已经关闭窗口的话,那么委托增加传值函数
                KVL.SelectedKeyValue += ReturnValue;

}

        private void ReturnValue(KeyValue args)
        {
            //MessageBox.Show(args.Value);
            txtVendor.Text = args.Value;
        }

在这5个方法中

第一个是双向的传值

第二个是单向的  也可以使双向

第三个是单向的

第四个也是单向的

第五个也是单向的

部分资料来自互联网

http://blog.csdn.net/tjvictor/article/details/824617

原文地址:https://www.cnblogs.com/jilodream/p/4222759.html