• 关于在窗体之间传值的问题 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

  • 相关阅读:
    【2019牛客暑期多校第三场】J题LRU management
    【2019多校第一场补题 / HDU6582】2019多校第一场E题1005Path——最短路径+网络流
    【bzoj2049】[Sdoi2008]Cave 洞穴勘测——线段树上bfs求可撤销并查集
    《DSP using MATLAB》Problem 8.36
    《DSP using MATLAB》Problem 8.35
    《DSP using MATLAB》Problem 8.34
    《DSP using MATLAB》Problem 8.33
    《DSP using MATLAB》Problem 8.32
    《DSP using MATLAB》Problem 8.31
    《DSP using MATLAB》Problem 8.30
  • 原文地址:https://www.cnblogs.com/jilodream/p/4222759.html
Copyright © 2020-2023  润新知