无法通过用户控制表单访问父表单的按钮属性

Can't access parent form's button properties through user control form

我有一个名为 MainBackground 的父窗体和一个名为 LoginUI 的用户控件。 LoginUI 停靠到 MainBackground。

当用户单击控件表单中的按钮 "Log in" 时,我需要将位于父表单中的按钮 (InfoButton) 的启用更改为 "true"。

但是我无法访问父按钮的属性。

控件窗体的按钮点击事件代码:

private void button1_Click(object sender, EventArgs e)
        {
            MainBackground.infoButton.Enabled = true;    
        }

我试过用父控件解决,但似乎还是不行。

感谢您的帮助!

您无法从 LoginUI 访问 MainBackground.infoButton,因为 infoButton 不是 static

要解决此问题,您可以通过 属性 注入 MainBackground,如下例

public partial class LoginUI : UserControl
{
    public MainBackground MainBackground { get; set; }  
    ...
}

MainBackground 你应该初始化你的 LoginUI.MainBackground 属性

loginUI1.MainBackground = this;

确保 infoButton public 通过将 修饰符 属性 设置为 public

现在您可以访问MainBackground.loginUI1

private void login_Click(object sender, EventArgs e)
{
   MainBackground.InfoButton.Enabled = true;
}

在按下 Login 按钮时启用 MainBackground 表单 InfoButton 的问题中描述的方法是一个常见的操作。但是,不是直接绑定 LoginUI 控件现在永远绑定到 MainBackground Form 的两个项目,您应该 de-couple 使用 Events.

这两个项目。

LoginUI 控件应发布一个事件,可能称为 LoginClicked。然后 MainBackground 表单可以订阅此事件并在单击登录按钮时执行所需的任何操作。

在 LoginUI 控件中,声明一个事件:

    public event EventHandler LoginClicked;

并且,每当按下登录按钮时将其升起:

    private void login_Click(object sender, EventArgs e)
    {
        OnLoginClicked(EventArgs.Empty);
    }

    protected virtual void OnLoginClicked(EventArgs e)
    {
        EventHandler handler = LoginClicked;
        if (handler != null)
        {
            handler(this, e);
        }
    }

最后,在MainBackground窗体class,订阅LoginClicked事件

    loginUI.LoginClicked += this.loginUI_LoginClicked;

像这样处理 LoginClicked 事件:

    private void loginUI_LoginClicked(object sender, EventArgs e)
    {
        InfoButton.Enabled = true;
    }