无法通过用户控制表单访问父表单的按钮属性
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;
}
我有一个名为 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;
}