簡體   English   中英

從子窗體按鈕訪問父窗體按鈕

[英]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屬性設置為internalpublic

但是,看來您之后將直接關閉表單,所以我只希望我的父表單訂閱該表單的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個解決方案:

  1. 將您的孩子表格更改為:

公共局部類UpdateForm:SystemForm

  1. 公開方式變更

公共無效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.

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