C# 事件驱动在 win 窗体上的用户控件之间

我有一个主窗体 (form1),它有一个面板 (panel1)——见图。

http://img2.mukewang.com/61ac76f50001f29008110483.jpg

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...";

    }

}

非常感谢任何帮助。


墨色风雨
浏览 208回答 2
2回答

汪汪一只猫

为什么在操作员按下按钮时部署和创建所有这些控件?更好的是创建两个 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);        } 这样,创建/添加/定位/添加事件处理程序的所有开销和所有清理都只完成一次:在构建表单期间。切换用户控件将在一瞬间完成

青春有我

我不确定您要完成什么,但看起来您正在尝试从其他对象更改对象的状态,而其他对象无法引用它们正在尝试更改的对象。在这种情况下,我将创建一个类型,作为订阅所有这些控件事件的某种管理器。您可以在 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 的自定义事件,您需要定义这些事件或找到通过内置事件传递必要信息的方法。创建事件非常简单,因此您可以在线查找。
打开App,查看更多内容
随时随地看视频慕课网APP