为了账号安全,请及时绑定邮箱和手机立即绑定

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 关注
  • 206 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信