【问题标题】:C# Winforms - Toggle viability states from one usercontrol to another usercontrol?C# Winforms - 将生存状态从一个用户控件切换到另一个用户控件?
【发布时间】:2023-03-13 05:32:01
【问题描述】:

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

目前正在尝试让 UserControl1.Button1 切换 UserControl2 上的可见性状态。

层次结构:

  1. Form1
    1. 用户控件1
      1. 按钮1
    2. 用户控件2
      1. 按钮1

我可以得到如下所示的变体,但从用户控件到用户控件似乎需要一些额外的步骤。救命!

    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】:

正如@hans-passant 指出的那样。

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

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

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了)

在表格 1 中:

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

在 UserControl1 button_click 中:

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

【讨论】:

  • 你是神。你不仅解释并展示了一个 sn-p,你还花时间解释了我不能感谢你的替代方案:)。
  • 不客气。不用谢我,能帮上忙我很高兴。
  • @Jeremy,顺便说一句,如果它对您有帮助并且有效,您也可以通过将其标记为答案来帮助我。谢谢。
  • marked :) 只是出于好奇,有没有办法通过定义孩子来激活事件?比如:this.haschildren(usrcntrl___);?
  • 嗨。抱歉,我没听懂。你问是否可以在满足特定条件时引发事件?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-04
  • 2015-05-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多