当前位置:编程学习 > C#/ASP.NET >>

请看这个变量的值怎么没变呢?

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的值没有变呢?还是"刘德华"呢? --------------------编程问答-------------------- Form1 form1 = new Form1();你这里重新new了一个Form1,又没有触发这个新new的form的button1_Click事件,字符串的值当然不会改变。 --------------------编程问答-------------------- 比如张三和李四各有3元钱。。张三被你抢了1元。。然后你说李四有多少钱? --------------------编程问答-------------------- 实例整错啦~~请看修改后的


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的肯定是初值
  }
  }
--------------------编程问答-------------------- 一般情况下,不会将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 楼 mathieuxiao 的回复:
一般情况下,不会将Form1赋值给Form2的Tag属性。如果是我写的话,会这样


请问:
 public   Form2(Form1 frm) : this()  //这句怎么解释    { 
        this.= frm;  //这种写法怎么解释
    } 

还第一次看到这些写法!!赞一个,麻烦解释一下,学学 --------------------编程问答-------------------- this关键字

  其用于引用类的当前实例,也包括继承而来的方法,通常可以隐藏this,MSDN中的小结功能主要包括:

  • 限定被相似的名称隐藏的成员

  • 将对象作为参数传递到其他方法

  • 声明索引器   --------------------编程问答-------------------- 1楼正解 --------------------编程问答-------------------- 1楼的就是答案呢
楼主可以看看窗体之间传值的方法呢
有5种,应该能找到你需要的呢。
--------------------编程问答-------------------- 两个form之间传值问题。form2中重新实例化的form1的buttonclick事件还没被触发呢 --------------------编程问答--------------------
引用楼主 aw214 的回复:
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 = "成龙";
      // 如果你把str传递到Form2,则会改变。。。。
      Form2 form2 = new Form2(str);
      form2.Show();
      form2.Invalidate();   
  }
  }


--------------------编程问答-------------------- --------------------编程问答--------------------
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,