[英]Accessing a Parent form button from a Child form button
我有一個具有父窗體的程序,然后創建了一個子窗體。 單擊子窗體中的updateButton時,我希望激發父窗體中的searchButton。
但是出於保護原因,我得到一個錯誤。 我嘗試將所有內容設置為“公開”,但仍然無法為我工作。
錯誤1“ SalesSystem.SystemForm.searchButton”由於其保護級別SalesSystem \\ UpdateForm.cs而無法訪問111 20 SalesSystem
到目前為止,這就是我所擁有的。
家長代號
namespace SalesSystem
{
public partial class SystemForm : Form
{
public SystemForm()
{
InitializeComponent();
}
protected void searchButton_Click(object sender, EventArgs e)
{
//search code
}
private void updateButton_Click(object sender, EventArgs e)
{
try
{
UpdateForm upForm = new UpdateForm(resultBox.SelectedItems[0].Text, dbdirec, dbfname);
upForm.ShowDialog(this);
}
catch (Exception)
{
//
}
}
}
子代碼
namespace SalesSystem
{
public partial class UpdateForm : Form
{
public UpdateForm(string selectedPerson, string dbdirec, string dbfname)
{
InitializeComponent();
}
private void updateButton_Click(object sender, EventArgs e)
{
//do stuff
SystemForm parent = (SystemForm)this.Owner;
parent.searchButton.PerformClick();
this.Close();
}
}
}
WinForm中默認將您的searchButton
按鈕控件設置為private
。 您已經說過將所有內容都設置為公開,但是我想您是說您已經將所有內容都設置為發布給公眾的代碼。 有幾種方法可以解決此問題。 直接的解決方法是直接轉到Visual Studio設計器,選擇按鈕,並將其Modifier
屬性設置為internal
或public
。
但是,看來您之后將直接關閉表單,所以我只希望我的父表單訂閱該表單的FormClosing
事件。
UpdateForm upForm = new UpdateForm(resultBox.SelectedItems[0].Text, dbdirec, dbfname);
upForm.FormClosing += (s, o) =>
{
//your code for what the parent class should do
};
upForm.ShowDialog(this);
如果您不關閉表單,則可以創建您自己的父表單所訂閱的事件處理程序。
您有2個選擇:
在您的父表單中創建一個public void search()
方法。 然后,您無需訪問父表單上的按鈕並調用其click事件,而直接運行搜索代碼。 新方法沒有綁定到GUI元素,並且以其他形式訪問它也不成問題。
更好的解決方案是創建一個委托。 委托是將在運行時分配的執行目標。 父窗體仍然具有public void search()
方法。 當創建子窗體時,它將把該函數的名稱作為參數傳遞。 子窗體不了解父窗體(相對於第一個選項,子窗體必須知道存在一個稱為search()
的方法)。 當需要通知創建子窗體的人時,將調用該委托。 這是一個小例子:
public partial class SystemForm : Form { public delegate void dSearch(); public SystemForm() { InitializeComponent(); } protected void searchButton_Click(object sender, EventArgs e) { search(); } private void search() { //search code } private void updateButton_Click(object sender, EventArgs e) { try { UpdateForm upForm = new UpdateForm(resultBox.SelectedItems[0].Text, dbdirec, dbfname, search); upForm.ShowDialog(this); } catch (Exception) { // } } }
和子窗體:
public partial class UpdateForm : Form
{
private SystemForm.dSearch _target;
public UpdateForm(string selectedPerson, string dbdirec, string dbfname, SystemForm.dSearch target)
{
_target = target;
InitializeComponent();
}
private void updateButton_Click(object sender, EventArgs e)
{
//do stuff
_target();
this.Close();
}
}
您應該使用“模型視圖控制器”或“模型視圖演示者”模式來處理這種事情。
每個表格僅應與向用戶顯示其內容有關。 當涉及到響應UI事件(例如按鈕單擊)時,每個表單(即每個"View"
)都應該簡單地引發一個事件,該事件通知控制器/演示者已經發生了某些事情。
然后,控制器/演示者應適當做出響應。 然后,將不同形式(例如您的示例中的父形式和子形式)組合在一起的邏輯被封裝在Controller類中。 這種邏輯實際上並不屬於任何一種形式。
我寫了一個示例,該示例演示了一個簡單的設計,該設計在不久前的另一個答案中做了這種事情。 與其在此處復制/粘貼所有內容,不如給我一個鏈接:
選中Form2上的復選框時,如何使Form1 label.text更改?
您必須向下滾動才能看到我的答案。 它與您所做的工作大致相似; 希望對您有意義! 按照說明制作一個測試應用程序並運行它以查看會發生什么。
我很累,可能會缺少一些東西,但這是正確的行為。
您的子窗體不會直接從父窗體繼承。
您的父表單具有受保護的級別,因此只有它和擴展它的類才能訪問該方法。
2個解決方案:
公共局部類UpdateForm:SystemForm
公共無效searchButton_Click(對象發送者,EventArgs e)
您可以從UpdateForm公開搜索事件,然后在SystemForm中訂閱該事件
namespace SalesSystem
{
public partial class SystemForm : Form
{
public SystemForm()
{
InitializeComponent();
}
protected void searchButton_Click(object sender, EventArgs e)
{
//search code
}
private void updateButton_Click(object sender, EventArgs e)
{
try
{
UpdateForm upForm = new UpdateForm(resultBox.SelectedItems[0].Text, dbdirec, dbfname);
upForm.OnSearch += Search;
upForm.ShowDialog(this);
}
catch (Exception)
{
//
}
}
private void Search(string searchParameter)
{
....
}
}
namespace SalesSystem
{
public delegate void SearchEventHandler(string searchParameter);
public partial class UpdateForm : Form
{
public event SearchEventHandler OnSearch;
public UpdateForm(string selectedPerson, string dbdirec, string dbfname)
{
InitializeComponent();
}
private void updateButton_Click(object sender, EventArgs e)
{
//do stuff
OnSearch("SearchThis");
this.Close();
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.