C#Winforms-将生存状态从一个用户控件切换到另一个用户控件?

问题描述 投票:0回答:1

我在下面附上我想用我的代码完成的示例。如果可能的话,有人可以写一个片段或解释它如何工作?我尝试了几种不同的方式,但都没有成功(我不断收到范围错误或用户控件无法识别)。

当前正在尝试获取UserControl1.Button1来切换UserControl2上的可见性状态。

层次结构:

  1. Form1
    1. UserControl1
      1. Button1
    2. UserControl2
      1. Button1

我可以对此进行一些修改,如下所示,但是从usercontrol到usercontrol似乎需要一些额外的步骤。帮助!

    private void button1_Click(object sender, EventArgs e)
    {
        this.Hide();
    }

    private void HIDE2_Click(object sender, EventArgs e)
    {
        userControl21.Hide();
    }
c# winforms user-controls
1个回答
0
投票

正如@ hans-passant指出的。

使用事件为我们提供了一种使用观察者模式的简便方法。

Event中实现自定义UserControl1,并在单击隐藏第二个控件的按钮时调用此事件(将更改通知给观察者:

public partial class UserControl1 : UserControl
{
    public event EventHandler HideRequested;

    ...

    private void button1_Click(object sender, EventArgs e)
    {
        if (HideRequested != null)
        {
            HideRequested.Invoke(this, EventArgs.Empty);
        }
    }

}

在Form1中,通过实现事件处理程序将其附加到事件:

    public Form1()
    {
        InitializeComponent();
        userControl11.HideRequested += userControl11_HideRequested;
    }

    void userControl11_HideRequested(object sender, EventArgs e)
    {
        userControl21.Hide();
    }

当然,还有其他方法可以实现此目的,但是任何其他方法都可能会在代码中引入耦合。例如,这也是有效的(通过将用户控件2的访问修饰符更改为public):

    private void button1_Click(object sender, EventArgs e)
    {
        (Parent as Form1).userControl21.Hide();
    }

您还可以想到这样的事情:(然后,您不必将USerControl2的访问修饰符更改为public)

在Form1中:

    public void HideUserControl2()
    {
        userControl21.Hide();
    }

并且在UserControl1 button_click中:

    private void button1_Click(object sender, EventArgs e)
    {
        (Parent as Form1).HideUserControl2();
    }
© www.soinside.com 2019 - 2024. All rights reserved.