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 关注
- 206 浏览
添加回答
举报