亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在用戶控件單擊事件中切換主窗體中的用戶控件

在用戶控件單擊事件中切換主窗體中的用戶控件

C#
不負相思意 2022-10-15 15:04:29
這聽起來可能很愚蠢,但我很難弄清楚這一點;任何幫助,將不勝感激:我有兩個名為“ Safety_Check ”和“ OEE_Track ”的用戶控件。在我的MainForm中,我有一個名為“ pnl_main_controller ”的面板,這是我顯示我的兩個用戶控件的地方。我的主窗體上有兩個按鈕,我可以在兩者之間動態切換,沒有任何問題。Safety_Check 用戶控制;public partial class Safety_Check : UserControl    {        private static Safety_Check _instance;        public static Safety_Check instance        {            get            {                if (_instance == null)                    _instance = new Safety_Check();                return _instance;            }        }        public Safety_Check()        {            InitializeComponent();        }        private void button1_Click(object sender, EventArgs e)        {            ///////------------------------        }    }OEE_Track 用戶控制public partial class OEE_Track : UserControl    {        private static OEE_Track _instance;        public static OEE_Track instance        {            get            {                if (_instance == null)                    _instance = new OEE_Track();                return _instance;            }        }        public OEE_Track()        {            InitializeComponent();        }    }主窗體:public partial class MainForm : Form    {     private void btn_reg_Click(object sender, EventArgs e)        {            if (!pnl_main_controller.Contains(Safety_Check.instance))            {                pnl_main_controller.Controls.Add(Safety_Check.instance);                Safety_Check.instance.Dock = DockStyle.Fill;                Safety_Check.instance.BringToFront();            }            else            {                Safety_Check.instance.BringToFront();            }        }我想做的是我的“ Safety_Check ”用戶控件上有一個名為“ Button1 ”的按鈕,每當我按下這個按鈕時,我希望“ Safety_Check ”在“ pnl_main_controller ”上消失并將“ OEE_Track ”帶到面板
查看完整描述

2 回答

?
呼喚遠方

TA貢獻1856條經驗 獲得超11個贊

控件之間的交互有多種解決方案??丶穷?,并且與任何其他類一樣,它們可以使用其公共屬性和方法或使用某些中介來相互交互。

在這種情況下,您的控件不需要相互了解,也不需要直接相互交互:

  • 他們可以要求另一個知道這兩個控件的對象來為他們完成這項工作。

  • 或者他們可以提出他們的請求通知,訂閱該通知的人將提供它。

要讓另一個對象為他們做這項工作,您有多種解決方案。例如,您可以在父窗體和子控件中實現特定接口,將父級強制轉換為該特定接口并調用為您完成工作的特定方法。

為了提高請求通知,一個簡單的解決方案是依賴事件。您可以在子控件中創建一個事件,并在您需要父控件為您做某事時引發它。然后在父母中訂閱該事件并完成工作。

示例 - 使用事件

我假設你有UserControl1內部Button1并且你已經處理ClickButton1. 然后您可以創建Button1Clicked事件并在單擊時引發它Button1

public event EventHandler Button1Clicked;

private void Button1_Click(object sender, EventArgs e)

{

    Button1Clicked?.Invoke(this, e);

}

然后在父表單中,訂閱事件并做任何你想做的事情:


private void userControl11_Button1Clicked(object sender, EventArgs e)

{

    //Hide userControl11 and show userControl21 

}

示例 - 使用界面


我假設,您有一個具有一些標準方法的接口:


public interface IDoSomething

{

    void DoSomething();

    void DoSomethingElse();

}

你已經在你的父表單中實現了接口:


public class Form1: Form, IDoSomething

{

    // ...


    public void DoSomething()

    {

        //Hide userControl11 and show userControl21 

    }

    public void DoSomethingElse()

    {

        // ...

    }

}

然后在您的用戶控制中:


private void Button1_Click(object sender, EventArgs e)

{

    var f = FindForm() as IDoSomething;

    if(f!=null)

        f.DoSomething();

}


查看完整回答
反對 回復 2022-10-15
?
一只甜甜圈

TA貢獻1836條經驗 獲得超5個贊

我想稍微擴展一下 Reza Aghaei 的回答。我認為它可以變得比現在更好。

第一種方法

如果我是你,我會有一些接口ICheckedView,它至少有 1 種方法來實現,如下所示:

ICheckedView{
    void Continue();}

現在,我們可以將此接口應用于解決方案中的任何類,但最有可能是視圖。接下來,我會讓你的主窗體實現這個接口并實現所需的方法。在這種情況下,我們希望我們的主窗體從面板中刪除控件并添加一個新控件。坦率地說,我們的安全檢查控件不需要(也許不應該)知道其他控件或接下來會發生什么。它僅用于控制流。

最后,您需要為 Safety_Check添加一個公共屬性,甚至可能是一個參數,ICheckedView其中包含一個參數。當您的安全檢查控件被點擊時,它可以告訴任何被傳遞給它的人(我們會說客戶端)它必須繼續。

第二種方法

它可以通過動作委托來完成。

如果您Action在安全檢查中添加一個委托,您可以直接彈出簽名與該委托匹配的任何方法 ( void methodName())。您的 Safety_Check 控件的構造函數應包含一個 Action,并且該 Action 將被分配給該類的私有字段。然后,當需要調用時,可以直接調用該操作。

此方法的注意事項

因為我們可能首先從 UI 線程調用,所以我們可能沒問題,但是您需要在這里考慮線程安全。調用所需模式可以幫助您解決這個問題。


查看完整回答
反對 回復 2022-10-15
  • 2 回答
  • 0 關注
  • 129 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號