對於訪問另一個表單上的成員,Robert的回答是正確的。但是,一般來說,你應該保存你的應用程序的狀態(稱爲「模型」),從用戶界面的狀態分別(稱之爲「視圖」)。隨着您的應用程序增長超過一個或兩個交互,這變得非常重要。關於如何將兩者結合在一起(例如Google的「模型 - 視圖 - 控制器」(MVC)和「模型 - 視圖 - 視圖模型」(MVVM)),有幾種哲學或模式,如果你真的想要正確地做到這一點,會推薦學習這些。我的首選是MVVM方法,即使它是在設計時考慮WPF應用程序,也可以使用Windows Forms輕鬆完成。
在.NET中,代碼應該使用來實現您的視圖模型和視圖之間的連接基本片被稱爲INotifyPropertyChanged的接口。您創建一個實現了這個接口,併發送通知的類每當屬性發生變化,因此,例如你的路徑屬性,你將創建這個類:
class ViewModel : INotifyPropertyChanged
{
private string path;
public string Path
{
get { return path; }
set {
if (value != path)
{
path = value;
NotifyPropertyChanged();
}
}
}
// This event gets triggered whenever a property changes.
public event PropertyChangedEventHandler PropertyChanged;
// This will cause the event to actually be triggered. It automatically determines the name of the property that triggered it using the [CallerMemberName] attribute - just a bit of .NET 4.5 sweetness. :)
private void NotifyPropertyChanged([CallerMemberName] String propertyName = "")
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
}
}
}
它可能看起來像很多工作,但現在在你的Form1中您可以創建一個新的「ViewModel」實例,訂閱該事件,然後將該實例傳遞給form2。然後,只要用戶選擇不同的路徑,form2就更新視圖模型實例上的Path屬性。
所以,Form1中需要靠近頂部驗證碼:
private ViewModel viewmodel = new ViewModel();
而這正好在Form1構造函數:
viewmodel.PropertyChanged += new EventHandler(OnPathChanged);
而且當你創建/顯示窗口2:
var form2 = new Form2(viewmodel); // Note, the viewmodel instance is being passed to the form2 constructor
form2.Show();
然後,form2構造函數將自己的引用存儲到「viewmodel」實例中,並且每當th e路徑被用戶改變。
private ViewModel viewmodel;
public Form2(ViewModel viewmodel)
{
this.viewmodel = viewmodel;
... // Other stuff to set up your controls etc. goes here
}
private void PathChanged(object sender, EventArgs e) // This may be named differently in your code; it's the event handler that gets called when the path changes
{
// This will automatically notify the event handler in Form1! It's super-elegant and flexible.
this.viewmodel.Path = txtPath.Text; // Assuming you have a textbox called txtPath
}
最後事件處理程序在Form1中:
private void OnPathChanged(object sender, EventArgs e)
{
var newPath = viewmodel.Path; // Get the updated path back from the viewmodel
//TODO: Whatever you want to do when the path changes.
}
下面是使用Windows窗體一個非常好的MVVM介紹的鏈接,它採用兩種形式就像你在你的例子都有。 MVVM (Model-View-ViewModel) Pattern For Windows Form Applications, using C#
一般來說,您將使用ShowDialog()顯示Form2,然後在Form1中檢查DialogResult.OK的結果(點擊「OK」按鈕時在Form2中將DialogResult設置爲OK)。正如RobertHavey所解釋的那樣,您將使用Form2的引用來訪問所需的值。缺少的成分是,您不能(默認情況下)訪問存儲在Form2上的TextBox中的值。您可以通過將TextBox的Modifiers()屬性設置爲Public來「解決」此問題。然而,首選的方法是在Form2上創建一個自定義屬性來保存該值。 –
完美! DialogResult正是我所需要的。我忘記了窗戶的回報。 –