簡體   English   中英

如何從另一個子表單更新一個子表單

[英]How do I update a child form from another child form

我有一個顯示父窗體(窗體1)和子窗體(窗體2)的應用程序。 在父級上,我單擊一個按鈕,該按鈕調用第二個子窗體(窗體3)作為模式對話框。 當我單擊對話框表單上的按鈕時,它將使用對話框表單中的文本更新父表單上的tableLayoutPanel。 我還需要它以相同的信息更新第一個子窗體上的tableLayoutPanel。

對於父窗體和對話框窗體,我使用此處提供的解決方案。 從孩子那里獲得價值,從父母那里獲得價值

首先, 要直接回答您的問題 ,您可以通過以下方式訪問任何表格:

Form frmIWantThisForm = System.Windows.Forms.Application.OpenForms.OfType<Form1>().First();

在此的示例Form1是所需的窗體的類名稱。 OpenForms是您的應用程序擁有的表單的集合。 此時,您可以訪問frmIWantThisForm.somePropertyOfTheForm;

例如(在上面的代碼設置了我想要的表單之后),我想用一個列表框的背景色名稱填充字符串(出於某種原因,我想我只是部分地使用了該列表框的背景色):

    //the 'true' causes a search of children as well:
    Control theControl = frmIWantThisForm.Controls.Find("listBox1",true).First();

    string bgColor = ((ListBox)theControl).BackColor.Name;

您可以做的其他事情 (仍然很簡單,但不是很好的選擇,因為隨着表單數量的增加,復雜性也會增加):

  1. 將表單分配給另一個表單的Tag屬性,以便它可以訪問調用表單(不是很清楚)。 tag屬性將自身存儲為一個對象,因此您需要再次使用強制類型轉換(例如在上面的示例中,當我將控件強制轉換為ListBox時)。
  2. 更改構造函數或要調用的對話框,以便您可以傳遞其他形式。 這個選項還不錯,因為至少可以很容易地看到數據的去向,但是隨着表格的增加,復雜性仍然會增加。

復雜(但更好)答案

但是,您正在遇到一種反模式( 可怕的編碼,請參閱Wiki定義 ),該樣式可能會在簡單的應用程序中起作用,但是復雜度將成倍增加。 每個表單都將引用其他所有表單,並且對代碼的更新將變得越來越復雜。 想象一下進行更新,然后突然您破壞了其他幾段代碼。

相反,我建議您將數據模型視圖 / 控制器代碼分開。 啟動應用程序時,將數據加載到控制器中。 退出時,保存回來。 也許最終您會更頻繁地這樣做。 然后,當您調用模式對話框時,如果該對話框用於模型的一部分,請傳入該部分,然后讓對話框根據該數據編輯模型。 這樣,您無需打開整個代碼中的控件,而是打開並打開下一個對話框,並根據模型更新它的“視圖”。

internal class MortgageAccounts
{
    internal List<Mortgage> Mortgages = new List<Mortgage>();

    internal decimal ComputeAverageAmount()
    {
        decimal amount = 0;
        //code to compute
        return amount;
    }

    internal void Load()
    {
        //Here you load your data from a save file, 
        //database, or some other method of deserializing.
    }

    internal void Save()
    {
        //Here you save your data (serialize in some way)
    }
}

internal class Mortgage
{
    internal int Id;
    internal decimal Amount;
}

您還可以做其他工作來將代碼分成概念部分,盡管這超出了問題的范圍,但請考慮研究此應用程序的MVC(模型視圖控制器)教程。 Code Project提供了一個入門指南

通過本文,我們對這些概念進行了以下描述:

  • 模型-這應該處理所有處理應用程序所需數據(換句話說,業務邏輯)的操作,從現在開始實施MVC模型的應用程序將稱為MVC應用程序。 這些操作可能意味着讀取數據,將數據寫入數據庫,通過網絡從遠程計算機獲取信息,耗時的操作等。模型還應告知視圖有關后台發生的數據的任何更改。
  • 視圖-該組件負責將數據呈現給用戶。 關於本文的上下文,即WinForms,視圖類將與將顯示給用戶的Form捆綁在一起。
  • 控制器-這是MVC模式的中心和重要組成部分,因為它將模型和視圖聯系在一起。 操作數據的模型和將數據呈現給用戶的視圖不知道彼此的存在,或者它們彼此直接交互。 充當中介並將它們聯系在一起的是控制器。 例如,如果應該啟動一個操作來操縱項目數據的操作,則控制器會從用戶那里獲取輸入信息,例如單擊按鈕,並通知模型采取適當的操作。

這是有關耦合與松耦合的一些其他讀物。 緊密耦合是指對象之間相互了解很多,而松散耦合是指對象之間不需要了解很多。 前者很難維護和更新,而后者通常是首選。

我並不是說以下內容適用於大型應用程序,但是對於小型應用程序,以下方法可以正常工作:

RitVerplaatsenForm dlg = new RitVerplaatsenForm(focusCell.Date.AddDays(rit<7?rit-1:0));
dlg.Text += string.Format("({0} records)",rows.Length);
if (dlg.ShowDialog() == DialogResult.OK)
{
     DateTime date = dlg.Date;
     //do stuff with the obtained date from the dialog
}

對話框類的Date屬性簡單明了:

public DateTime Date
{
    get
    {
        return this.monthCalendar1.SelectionStart;
    }
    set
    {
        monthCalendar1.SelectionStart = value;
    }
}

對於不太復雜的GUI和不太復雜的應用程序,這很好。 當然,某些應用程序從簡單開始,然后逐漸增長。 但是我認為您不必從一開始就從大手筆開始。

有問題的代碼是復制粘貼,然后從實際應用程序中刪除了一些開銷,因此您可以看到更多的信息。 這個應用程序在.NET中創建了一些水晶報表,重點實際上是報表,而不是我用來驅動用戶訪問報表的對話框。

  • 在第1行中,我實例化表單並通過表單的構造函數傳遞信息。 事實上,這是一個FocusCell...。您必須以此為基礎進行抽象,您可以根據需要將任何方式傳遞給對話框。
  • 第二行,我正在更新對話框的標題。 這很實用,也可以在對話框的構造函數中完成。 在瑞士,有數百萬種方法可以達成目標。
  • 第3行顯示對話框
  • 第5行從對話框中獲取結果。

get,set通過與對話框用戶不同的名稱公開了monthCalender的屬性。 您還可以將monthCalendar公開,但這是一種更為實用的方法。 關鍵是我想獲得一個日期。 對話框的用戶不關心日期實際來自何處,對話框上也沒有月歷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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