public partial class Form1 : Form
  {
  public Form1()
  {
  InitializeComponent();
  }
    
  private void Form1_Load(object sender, EventArgs e)
  {
    
  }
  public string str = "刘德华";
  private void button1_Click(object sender, EventArgs e)
  {
  str = "成龙";
  Form2 form2 = new Form2();
  form2.Show();
  form2.Invalidate();   
  }
  }public partial class Form2 : Form
  {
  public Form2()
  {
  InitializeComponent();
  }
  Form1 form1 = new Form1();
  private void Form2_Load(object sender, EventArgs e)
  {     }
  private void Form2_Paint(object sender, PaintEventArgs e)
  {
  MessageBox.Show(form1.str); //弹出来对话窗口怎么还是"刘德华"呢?
  }
  }
问题:点击Button1的时候,str的值已经变成"成龙"了,为什么在Form2_Paint中弹出的对话窗口,str的值没有变呢?还是"刘德华"呢?

解决方案 »

  1.   

    Form1 form1 = new Form1();你这里重新new了一个Form1,又没有触发这个新new的form的button1_Click事件,字符串的值当然不会改变。
      

  2.   

    实例整错啦~~请看修改后的
    public partial class Form1 : Form
      {
      public Form1()
      {
      InitializeComponent();
      }
        
      private void Form1_Load(object sender, EventArgs e)
      {
        
      }
      public string str = "刘德华";
      private void button1_Click(object sender, EventArgs e)
      {
      str = "成龙";
      Form2 form2 = new Form2();
      form2.Tag = this;
      form2.Show();
      form2.Invalidate();   
      }
      }public partial class Form2 : Form
      {
      public Form2()
      {
      InitializeComponent();
      }
      //Form1 form1 = new Form1();
      private void Form2_Load(object sender, EventArgs e)
      {     }
      private void Form2_Paint(object sender, PaintEventArgs e)
      {
      MessageBox.Show((this.Tag as Form1).str); //用之前创建的Form1的实例就OK了,新new的肯定是初值
      }
      }
      

  3.   

    一般情况下,不会将Form1赋值给Form2的Tag属性。如果是我写的话,会这样实例整错啦~~请看修改后的 [code=C#] 
    public   partial   class   Form1   :   Form 

        public   Form1() 
        { 
            InitializeComponent(); 
        } 
            
        private   void   Form1_Load(object   sender,   EventArgs   e) 
        { 
            
        } 
        public   string   str   =   "刘德华 "; 
        private   void   button1_Click(object   sender,   EventArgs   e) 
        { 
            str = "成龙 "; 
            Form2 form2 = new Form2(this); 
            form2.Show(); 
            form2.Invalidate();       
        } 
    } public   partial   class   Form2   :   Form 

        Form1 form1; 
        public   Form2() 
        { 
            InitializeComponent(); 
        }     public   Form2(Form1 frm) : this()
        { 
            this.= frm;
        } 
        
        private   void   Form2_Load(object   sender,   EventArgs   e) 
        {           } 
        private   void   Form2_Paint(object   sender,   PaintEventArgs   e) 
        { 
            MessageBox.Show(form1.str);   //用之前创建的Form1的实例就OK了,新new的肯定是初值 
        } 
      

  4.   


    请问:
     public   Form2(Form1 frm) : this()  //这句怎么解释    { 
            this.= frm;  //这种写法怎么解释
        } 还第一次看到这些写法!!赞一个,麻烦解释一下,学学
      

  5.   

    this关键字  其用于引用类的当前实例,也包括继承而来的方法,通常可以隐藏this,MSDN中的小结功能主要包括:  • 限定被相似的名称隐藏的成员  • 将对象作为参数传递到其他方法  • 声明索引器  
      

  6.   

    两个form之间传值问题。form2中重新实例化的form1的buttonclick事件还没被触发呢
      

  7.   


    private void button1_Click(object sender, EventArgs e)
      {
          str = "成龙";
          // 如果你把str传递到Form2,则会改变。
          Form2 form2 = new Form2(str);
          form2.Show();
          form2.Invalidate();   
      }
      }