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

时间:2018-03-20 07:41:13

标签: c# winforms user-controls

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

我需要将位于父窗体中的按钮(InfoButton)的可用性更改为" true"当用户点击按钮时#34;登录"在控制表格中。

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

控制表格的按钮点击事件代码:

customMouseOver(e){
  return (
   <div className="customMouseOver">
     //e hold the line data in payload element
   </div>
  );
}

我尝试使用父控件解决它,但它似乎仍然无法正常工作。

感谢您的帮助!

2 个答案:

答案 0 :(得分:0)

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

要解决这个问题,你可以通过如下例子

之类的属性注入MainBackground
public partial class LoginUI : UserControl
{
    public MainBackground MainBackground { get; set; }  
    ...
}
<{>>在MainBackground中,您应该将LoginUI.MainBackground属性

归为一类
loginUI1.MainBackground = this;

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

现在您可以访问MainBackground.loginUI1

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

答案 1 :(得分:0)

按下MainBackground按钮时,启用InfoButton表单Login的问题中描述的方法是一项常见操作。但是,不是直接绑定LoginUI控件现在永远绑定到MainBackground表单的两个项目,而是应该使用事件将两者分开。

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表单类中,订阅LoginClicked事件

    loginUI.LoginClicked += this.loginUI_LoginClicked;

像这样处理LoginClicked事件:

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