第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

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

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

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

C#
不負(fù)相思意 2022-10-15 15:04:29
這聽起來可能很愚蠢,但我很難弄清楚這一點;任何幫助,將不勝感激:我有兩個名為“ Safety_Check ”和“ OEE_Track ”的用戶控件。在我的MainForm中,我有一個名為“ pnl_main_controller ”的面板,這是我顯示我的兩個用戶控件的地方。我的主窗體上有兩個按鈕,我可以在兩者之間動態(tài)切換,沒有任何問題。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 ”的按鈕,每當(dāng)我按下這個按鈕時,我希望“ Safety_Check ”在“ pnl_main_controller ”上消失并將“ OEE_Track ”帶到面板
查看完整描述

2 回答

?
呼喚遠(yuǎn)方

TA貢獻1856條經(jīng)驗 獲得超11個贊

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

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

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

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

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

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

示例 - 使用事件

我假設(shè)你有UserControl1內(nèi)部Button1并且你已經(jīng)處理ClickButton1. 然后您可以創(chuàng)建Button1Clicked事件并在單擊時引發(fā)它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 

}

示例 - 使用界面


我假設(shè),您有一個具有一些標(biāo)準(zhǔn)方法的接口:


public interface IDoSomething

{

    void DoSomething();

    void DoSomethingElse();

}

你已經(jīng)在你的父表單中實現(xiàn)了接口:


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();

}


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

TA貢獻1836條經(jīng)驗 獲得超5個贊

我想稍微擴展一下 Reza Aghaei 的回答。我認(rèn)為它可以變得比現(xiàn)在更好。

第一種方法

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

ICheckedView{
    void Continue();}

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

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

第二種方法

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

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

此方法的注意事項

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


查看完整回答
反對 回復(fù) 2022-10-15
  • 2 回答
  • 0 關(guān)注
  • 112 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號