簡體   English   中英

表格之間溝通的最佳方式?

[英]Best way to communicate between forms?

我幾乎從不使用(高級或根本沒有)圖形界面,或者一個簡單控件的簡單形式......但這次我有一些更復雜的東西,而且我沒有太多的GUI經驗。 我有一個主要形式(未來可能更多),其他子形式也可以打開(並且它們可能有自己的子形式),我想知道在你看來,它們之間進行通信的最佳方式是什么?

我想把主窗體作為參數傳遞給子窗體的構造函數,但它似乎不是一種好方法,特別是如果我需要在其他不同的子窗體之間進行通信,而不是提到我必須仔細檢查輸入,或者做一些方法,但它似乎更像是函數式編程而不是面向對象的編程...

也許我可以:

  • 為全局設置創建靜態類(或Properties.Settings)。 缺點:每次更改數據都需要復制到課堂上,我正在尋找一些更舒適和優雅的東西。
  • 使用從Application.OpenForms訪問控件的丑陋方式 - 修復了將主窗體作為參數傳遞的問題。 缺點:不太穩定。
  • 做一些我沒有想過的事情。 建議? 缺點:不知道它到底是什么。

您的構造函數可能是回到主窗體的最合理的通信方法。 您的子表單將執行以下操作:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM