[英]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;
您可以做的其他事情 (仍然很簡單,但不是很好的選擇,因為隨着表單數量的增加,復雜性也會增加):
但是,您正在遇到一種反模式( 可怕的編碼,請參閱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中創建了一些水晶報表,重點實際上是報表,而不是我用來驅動用戶訪問報表的對話框。
get,set通過與對話框用戶不同的名稱公開了monthCalender的屬性。 您還可以將monthCalendar公開,但這是一種更為實用的方法。 關鍵是我想獲得一個日期。 對話框的用戶不關心日期實際來自何處,對話框上也沒有月歷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.