[英]What is the most elegant way to call an event of another Form?
假設我有一個名為Form1
的表單,它將以某種方式(不相關)調用另一個表單Form2
(Form1中)
Form2 f2= new Form2();
f2.ShowDialog();
該Form2
具有一個按鈕,該按鈕將在用戶每次單擊該按鈕時進行一些操作 。
但是,我希望第一次,即僅顯示Form2時,按鈕( 某些操作 )中的代碼將被執行。
換句話說,我必須能夠在Form2的button_Click
調用私有的代碼。
現在,我可以想到一些方法來實現這一點(將click事件公開等),但是我的問題是,最優雅(或最正確)的方法是什么?
我將向Form2
添加一個屬性,以告訴我要自動執行動作的表單。
class Form2
{
public bool AutoExecuteSomeOperation { get; set; }
}
在Form1
,您將設置該屬性,而在Form2
您將檢查並執行相應的代碼(如果設置了該屬性)。
我建議您重構button_Click
來調用另一個方法,您也可以調用該方法來自動執行。 我喜歡使事件處理程序保持簡單,並且僅對用於命名事件處理程序的控件上的事件執行。 因此,您知道button_Click
是名為button
的控件上Click
事件的處理程序。 它使代碼更易於維護。
您可以決定在執行代碼后是否要重置屬性,或者可以添加一些驗證以確認屬性更改是有效的。 例如,您可能需要確保在顯示表單之前調用該屬性。
在所有情況下,都應避免從外部表單中引用任何控件。 只有Form1
本身應該知道它包含一個按鈕。 來自外界的任何使用都應通過公共財產或此類形式的公共活動來進行。 這樣,如果您決定應將按鈕替換為超鏈接,菜單項,復選框或其他任何Form1
則不需要更新。 這與UserControl
應該執行的操作非常相似。 內部細節泄漏越少,無需更新所有呼叫者就越容易進行內部更改。
最簡單的方法就是將其公開,但是它不是出色設計的堡壘。
解耦消息傳遞可能是事件聚合器或任何pub子方法消息傳遞系統所需要的。 這是一種更現代且可擴展的方法,參與者不需要彼此了解,可以讓您將方法設置為私有,並為您提供更可維護的解耦解決方案,並使您的類保持一致。
Unity , MvvmLight都具有這類消息傳遞系統,但是其中有很多。
如何運作的范例
public Form1()
{
InitializeComponent();
EventPublisher.Instance.Subscribe<NewUserCreated>
(n => listBoxUsers.Items.Add(n.User.Name));
}
...
// some other class
private void Form2()
{
var user = new User()
{
Name = textBoxUserName.Text,
Password = textBoxPassword.Text,
Email = textBoxEmail.Text
};
EventPublisher.Instance.Publish(new NewUserRequested(user));
}
將代碼從OnClick事件移到其自己的方法(例如“ DoWork”)中,然后從OnClick事件中調用該方法。
創建表單時都可以調用它
var frm = new demoForm();
frm.DoWork();
frm.Show();
或在表單構造函數中調用它。
public partial class demoForm : Form {
public demoForm() {
InitializeComponent();
DoWork();
}
private void button1_Click(object sender, EventArgs e) {
DoWork();
}
public void DoWork() {
//Code here
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.