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

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

C# 事件驅動在 win 窗體上的用戶控件之間

C# 事件驅動在 win 窗體上的用戶控件之間

C#
墨色風雨 2021-12-05 16:22:59
我有一個主窗體 (form1),它有一個面板 (panel1)——見圖。Panel1 根據按下的按鈕(以模擬屏幕變化)加載兩種不同的用戶控件之一。我在用戶控件 1 上有一個按鈕,需要在用戶控件 2 上執行(更改文本)。我遇到的問題是用戶控件是通過按表單 1 上的按鈕動態創建的(請參見下面的代碼),這導致我在嘗試鏈接事件時出現問題 -public partial class Form1 : Form{    public Form1()    {        InitializeComponent();        panel1.Controls.Add(new Screens.UC1());    }    private void button1_Click(object sender, EventArgs e)    {        foreach (Control ctrl in panel1.Controls)        {            ctrl.Dispose();        }        panel1.Controls.Add(new Screens.UC1());    }    private void button2_Click(object sender, EventArgs e)    {        foreach (Control ctrl in panel1.Controls)        {            ctrl.Dispose();        }        panel1.Controls.Add(new Screens.UC2());    }}當動態創建對象的實例時,處理將這些類型的項目與事件聯系起來的最佳方法是什么。我還嘗試制作屏幕實例,然后引用這些實例,但這遇到了范圍問題。UC1 代碼(用戶控制 1)public partial class UC1 : UserControl{    public UC1()    {        InitializeComponent();    }    private void button1_Click(object sender, EventArgs e)    {        //Event to change text on UC2    }}UC2 代碼(用戶控制 2)public partial class UC2 : UserControl{    public UC2()    {        InitializeComponent();    }    public void WriteText(object sender, EventArgs e)    {        label2.Text = "Text Changed...";    }}非常感謝任何幫助。
查看完整描述

2 回答

?
汪汪一只貓

TA貢獻1898條經驗 獲得超8個贊

為什么在操作員按下按鈕時部署和創建所有這些控件?


更好的是創建兩個 UserControl。一個是操作員按下按鈕 1 時要顯示的所有控件,另一個是操作員按下按鈕 2 時要顯示的所有控件。


要創建用戶控件,請使用菜單項目 - 添加用戶控件,或右鍵單擊項目的解決方案資源管理器并選擇add new item。


使用您想要顯示的所有控件布局您的用戶控件。添加事件處理程序等。


然后在你的表格中:


private readonly UserControl userControl!;

private readonly UserControl userControl2;


public MyForm()

{

    InitializeComponent()

    this.userControl1 = new UserControlA(...);

    this.userControl2 = new UserControlB(...);


    // make sure that the user controls are Disposed when this form is Disposed:

    this.Components.Add(this.userControl1);

    this.Components.Add(this.userControl2);

}


void OnButton1Clicked(object sender, ...)

{

    // remove userControl2 from the panel

    this.Panel1.Controls.Remove(this.userControl2);

    // add userControl1 to the panel

    this.Panel1.Controls.Add(this.userControl1);        

這樣,創建/添加/定位/添加事件處理程序的所有開銷和所有清理都只完成一次:在構建表單期間。切換用戶控件將在一瞬間完成


查看完整回答
反對 回復 2021-12-05
?
青春有我

TA貢獻1784條經驗 獲得超8個贊

我不確定您要完成什么,但看起來您正在嘗試從其他對象更改對象的狀態,而其他對象無法引用它們正在嘗試更改的對象。


在這種情況下,我將創建一個類型,作為訂閱所有這些控件事件的某種管理器。您可以在 UC 課程中創建您自己的事件,或者click像您已經在做的那樣使用 Windows 窗體事件。


由于事件的處理程序是在管理器中定義的,您可以輕松編寫適用于其他用戶控件的邏輯,只要管理器引用它們即可。


像這樣:


public class ClickTrafficer {

    private UC target;


    public void HandleClick(object sender, UCClickHandlerEventArgs ea) {

        target.WriteText(ea.TextToWrite);

    }

}


public Form1()

{

    InitializeComponent();

    var trafficer = new ClickTrafficer();

    var screen1 = new Screens.UC1();

    screen1.Click += trafficer.HandleClick;

    panel1.Controls.Add(screen1);

}

這是您可以做什么的粗略想法。這里缺少設置target字段必須設置的任何邏輯。您需要創建邏輯來告訴交易員哪個控件設置哪個控件的文本。


此外,ClickTrafficer我創建的使用帶有自定義 eventargs 的自定義事件,您需要定義這些事件或找到通過內置事件傳遞必要信息的方法。創建事件非常簡單,因此您可以在線查找。


查看完整回答
反對 回復 2021-12-05
  • 2 回答
  • 0 關注
  • 230 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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