2012-02-08 42 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

相關問題