2012-02-08 41 views
0

我是C#编程新手,但我知道属性应该封装在类中。所以我用私有声明如何更新字符串“_servername”从第二个表格

private string _servername; 

问题是,我不能从第二型更新_servername。我点击ChangeName按钮。新出现Form2。我点击了按钮NewName。来自Form1的方法已成功完成,并且方法_Server2中的MessageBox向我显示值_servername应为“TEST” 当我单击按钮CurrentServerName时,_servername的值仍为“localhost”。你能告诉我为什么吗?如何解决它?谢谢你在前进

FORM 1

namespace Test 
{ 
    public partial class Form1 : Form 
    { 
     private string _servername; 
     public Form1() 
     { 
      InitializeComponent(); 
      _servername = "localhost"; 
     } 

     public string _Server(string _server) 
     { 
      _servername = _server; 
      string serverlist2 = _server;    
      _Server2(serverlist2); 
      return serverlist2; 
     } 

     public void _Server2(string _server2) 
     { 
      _servername = _server2; 
      MessageBox.Show(_servername); 
     } 

     private void ChangeName_Click(object sender, EventArgs e) 
     { 
      Form2 _Form2 = new Form2(); 
      _Form2.Show(); 
     } 

     private void CurrentServerName_Click(object sender, EventArgs e) 
     { 
      MessageBox.Show(_servername); 
     } 

    } 
} 

FORM 2

namespace Test 
{ 
    public partial class Form2 : Form 
    { 
     public Form2() 
     { 
      InitializeComponent(); 
     } 

     private void NewName_Click(object sender, EventArgs e) 
     { 
      Form1 _Form1 = new Form1(); 
      _Form1._Server("TEST"); 
      this.Close(); 
     } 
    } 
} 
+0

当我想你的意思“成员应该可以封装在 '属性应该在一个类来封装'一类'。属性是另一回事全部在一起http://www.devx.com/dotnet/Article/11579/1954 – Darbio 2012-02-08 12:32:52

+0

好的,谢谢纠正 – cotablise 2012-02-08 13:26:37

+0

没有戏剧,很高兴有帮助! – Darbio 2012-02-08 23:12:11

回答

0

您不想在Form2内部创建Form1的新实例。相反,当您创建一个Form2实例来显示它时,请将对当前Form1实例的引用传递给构造函数。然后您可以访问Form1现有实例上的方法。这里有一个例子:

表1

private void ChangeName_Click(object sender, EventArgs e) 
{ 
    // Pass a reference to this form instance using the 'this' keyword 
    Form2 _Form2 = new Form2(this); 
    _Form2.Show(); 
} 

表2

namespace Test 
{ 
    public partial class Form2 : Form 
    { 
     // Hold an instance to Form1 
     private Form1 mForm1; 

     public Form2(Form1 form1) 
     { 
      // Store instance to form1 
      mForm1 = form1; 

      InitializeComponent(); 
     } 

     private void NewName_Click(object sender, EventArgs e) 
     { 
      // Change name on existing instance of form 1 
      mForm1._Server("TEST"); 
      this.Close(); 
     } 
    } 
} 
+0

这正是我想要的。没有公共属性。非常感谢 – cotablise 2012-02-08 12:33:57

+0

@cotabolise:members ...不属性 - 属性是完全不同的,例如'[XmlIgnore]' – Darbio 2012-02-08 23:11:51

2

因为您要建立内部Form2Form1一个新的 “实例” 这不行,这与其他Form1不一样。

您需要更改Form1中是这样的:

private void ChangeName_Click(object sender, EventArgs e) 
{ 
    using (Form2 form2 = new Form2()) 
    { 
     form2.Show(); 
     _Server(form2.ServerName); 
    } //Ensure the form is Disposed. 
} 

1和Form 2这样的:

namespace Test 
{ 
    public partial class Form2 : Form 
    { 
     public Form2() 
     { 
      InitializeComponent(); 
     } 

     public String ServerName { get; private set; } //Can only be set in this class, but read by all. 

     private void NewName_Click(object sender, EventArgs e) 
     { 
      ServerName = "Test"; 
      Close(); 
     } 
    } 
} 

编辑:还有一点。像_Server()这样的命名方法和像_Form2这样的局部变量是不好的做法,他们推断为Server()form2。看看this MSDN article以及question

+0

非常感谢您的帮助和提示。我会记住它 – cotablise 2012-02-08 12:35:02

相关问题