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

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 的自定義事件,您需要定義這些事件或找到通過內置事件傳遞必要信息的方法。創建事件非常簡單,因此您可以在線查找。
- 2 回答
- 0 關注
- 230 瀏覽
添加回答
舉報