[英]Best way to communicate between forms?
我幾乎從不使用(高級或根本沒有)圖形界面,或者一個簡單控件的簡單形式......但這次我有一些更復雜的東西,而且我沒有太多的GUI經驗。 我有一個主要形式(未來可能更多),其他子形式也可以打開(並且它們可能有自己的子形式),我想知道在你看來,它們之間進行通信的最佳方式是什么?
我想把主窗體作為參數傳遞給子窗體的構造函數,但它似乎不是一種好方法,特別是如果我需要在其他不同的子窗體之間進行通信,而不是提到我必須仔細檢查輸入,或者做一些方法,但它似乎更像是函數式編程而不是面向對象的編程...
也許我可以:
您的構造函數可能是回到主窗體的最合理的通信方法。 您的子表單將執行以下操作:
public class SubForm : Form
{
public SubForm(MainForm parentForm)
{
_parentForm = parentForm;
}
private MainForm _parentForm;
private void btn_UpdateClientName_Click(object sender, EventArgs e)
{
_parentForm.UpdateClientName(txt_ClientName.Text);
}
}
然后在MainForm
上公開公共方法:
public class MainForm : Form
{
public void UpdateClientName(string clientName)
{
txt_MainClientName.Text = clientName;
}
}
或者,您可以反過來訂閱SubForms中的事件:
public class MainForm : Form
{
private SubForm1 _subForm1;
private SubForm2 _subForm2;
public MainForm()
{
_subForm1 = new SubForm1();
_subForm2 = new SubForm2();
_subForm1.ClientUpdated += new EventHandler(_subForm1_ClientUpdated);
_subForm2.ClientUpdated += new EventHandler(_subForm2_ProductUpdated);
}
private void _subForm1_ClientUpdated(object sender, EventArgs e)
{
txt_ClientName.Text = _subForm1.ClientName; // Expose a public property
}
private void _subForm2_ProductUpdated(object sender, EventArgs e)
{
txt_ProductName.Text = _subForm2.ProductName; // Expose a public property
}
}
一種好方法是以想要開始通信的形式聲明委托。 您需要一個委托和一個回調函數:
public delegate void SetValueDelegate(string value);
public SetValueDelegate SetValueCallback;
然后,另一個表單可以附加到此委托。 在那一刻,兩種形式都必須相互了解,但不是在那之后:
firstForm.SetValueCallback += new SetValueDelegate(secondForm.SetValueFunction);
第二種形式必須聲明一個與委托定義匹配的函數:
public void SetValueFunction(string value)
{
// do something
}
現在,第一個表單可以使用委托來使用第二個表單的函數(以及附加到委托的所有其他表單或類:
SetValueCallback(txtParam.Text);
編輯:做了一個完整的例子
using System;
namespace DelegateTest
{
public delegate void SetValueDelegate(string value);
public class Class1
{
public SetValueDelegate SetValueCallBack;
public void Test()
{
if(SetValueCallBack != null)
{
SetValueCallBack("Hello World!");
}
}
}
public class Class2
{
public void SetValueFunction(string value)
{
Console.WriteLine(value);
}
}
public class Launcher
{
public static void Main(string[] args)
{
Class1 c1 = new Class1();
Class2 c2 = new Class2();
c1.SetValueCallBack += new SetValueDelegate(c2.SetValueFunction);
c1.Test();
}
}
}
您可以使用表單的內置Tag屬性,該屬性是“對象”類。
public Form1(){(ComplicatedDataStructure)Tag = new ComplicatedDataStracture(); }。 。 form1 = new Form1(); 。 。 form2 = new Form2(); 。 。 form2.Tag = form1.Tag;
所以form2.Tag等於“ComplicatedDataStracture”對象;
最靈活,可擴展(以及恕我直言,最專業)的方法是使用CAB(復合應用程序塊) 。 簡單來說,CAB是一組2-3個程序集,它們以正確的方式實現了復雜的UI應用程序所需的大量管道,並且它以一種很好的方式將這個管道公開給了庫的用戶。 其中它有一個非常好的事件和命令(如命令模式)系統。
缺點:需要一些時間來學習,而不是很容易掌握。
這是一個全面(但易於理解)的教程 ,可以幫助您更輕松地學習。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.