现有form1和form2,在form1中定义了变量A,并且A的值来自于数据库中不同遍历条件所获取的数据。如何在form2中引用A的值呢?C#中没有了全局变量,想了好几个办法都行不通,望指点!

解决方案 »

  1.   

    在FORM2构造函数里面传值呀 你的FORM1应该是个主窗体吧  在FORM1 NEW FORM2的时候把A的值传递过去!
      

  2.   

    form1不是主窗体。我是form1中点击确定后show form2的,但2个form之间并无关联。
      

  3.   

    form2 form2=new form2(你要传递的值)
      

  4.   

    form2 form2=new form2(你要传递的值)是不是哪里打错了?
      

  5.   

    最简单的方法就是定义一个全局静态变量,使用方法就像asp.net中的session。
    比如定义一个string: public static int flag=1;  
    那么你在整个application里面都可以调用到flag来保存你要的int值
      

  6.   

    说错了 应该是比如定义一个全局变量int 手误
      

  7.   


    这里面没有错, 你在FORM2里面定义个构造函数。看你要传什么类型的变量。然后在FORM1里面
    Form2 form2=new Form2(你要传递的值) 
    括号里面就是你要传递的值
      

  8.   

    首先,我写的是winform。
    其次,我要传递的必须是一个string 变量呀。
    最后,这个变量A的取值是随时变的,不是固定的。并不是传递初始值就算了呀。
      

  9.   

    或者我把我的2个form的代码贴出来,麻烦大家帮下忙,谢谢!
      

  10.   

    第一个form:public partial class kaitai : Form
        {
           public kaitai()
            {
                InitializeComponent();
            }
                   public void button1_Click(object sender, EventArgs e)
            {
                string Cnum = "";
                foreach (DataGridViewRow row in dataGridView1.Rows)
                {
                    if (Convert.ToBoolean(row.Cells[0].Value))
                    {
                      Cnum =(row.Cells[1].Value.ToString());
                    }
                } 
                string Afile = "provider=Microsoft.Jet.OleDb.4.0;Data Source=1.mdb";
                OleDbConnection AconnStr = new OleDbConnection(Afile);
                OleDbCommand Icmd = new OleDbCommand("update TableUSE set A='C' where AA='" + Cnum + "'", AconnStr);
                AconnStr.Open();
                int ExeNum = Icmd.ExecuteNonQuery();
                AconnStr.Close();
                this.Hide();
                addfood.Show();
             }
        }第二个form:    public partial class addfood : Form
        {
            public addfood()
            {
                InitializeComponent();
            }
                    private void textBox1_TextChanged(object sender, EventArgs e)
            {
                  我是希望把第一个form的Cnum变量的值传递到textbox1这里,并在界面上显示出来。
            }
        }
      

  11.   

    有一个简单的方法就是在项目里建一个公共类,里面定义公共静态变量,把一个窗口处理出来的数值保存到静态变量,然后另外一个窗口要用的时候直接用静态变量就可以了
    静态变量也不用new,直接类名.变量名就可以用了
      

  12.   

    在项目中添加一个类
    public static class 类名()
    {
       public static string 变量名;
    }第一个form中在
    if (Convert.ToBoolean(row.Cells[0].Value)) 

        Cnum =(row.Cells[1].Value.ToString()); 

    添加代码,变为如下
    if (Convert.ToBoolean(row.Cells[0].Value)) 

        Cnum =(row.Cells[1].Value.ToString()); 
        类名.变量名=Cnum;
    } 第二个form中在
     private void textBox1_TextChanged(object sender, EventArgs e) 

       我是希望把第一个form的Cnum变量的值传递到textbox1这里,并在界面上显示出来。 

    添加代码,变为如下
     private void textBox1_TextChanged(object sender, EventArgs e) 

       textBox1.Text=类名.变量名; 

      

  13.   

    感谢14楼的朋友,效果是差不多实现了,不过有一个小问题,就是在form2打开的时候,textbos里并不会马上就显示出Cnum的值,而需要在上面随便按一下键盘才会显示,这是什么问题呢?
      

  14.   

    那是你的方法有问题,不应该是textBox1的TextChanged事件
    而应该是form2的load事件
    private void form2_load(object sender, EventArgs e) 

      textBox1.Text=类名.变量名; 

      

  15.   

    给你几个可行的方法:
    1、定向传递,Form1声明一个public或者internal(要求同一个namespace)变量,在form2创建之后直接使用form1的这个变量,这样就可以把form1的这个值传到form2里面去。
    方法1最简单,也最不推荐,可能会存在安全问题,比如form2访问该变量的时候,该变量并没有准备好,关键是破坏了OOP语言模式。
    2、使用观察者模式,让form2去观察form1,自己去查设计模式,有的是例子,C#的话,实现Observer类或者实现ObserverCollection接口。
    3、C#的话使用反射技术进行数据绑定,绑定的就是这个要传递的值,这本身也是观察者模式的一种实现,只不过内部机制被C#语言帮你实现了。
    4、C#的话,让类实现INotifiyValueChanged接口。
    5、form1和form2之间实现消息循环,这是最基本的win32平台思想。
    方法5灵活,关键是比起前几种方法,不仅可以实现同步传递,更可以实现异步通信,对于并行线程很有效。就这几个应该够你用的了。就提示到这里,我觉得已经说得很明白了。具体的自己查,不会自己查的人不要再去编程了,或者本来你这些都了解,只是一时想不起来用它们,提示到此。
      

  16.   

    终于解决问题了。。学到了不少东西,谢谢lenheat!