C# 有没有办法通过用户控件禁用主窗体上的按钮
我试图使用主窗口面板中的用户控件禁用主窗体上的一些按钮。我认为这段代码不起作用是因为继承C# 有没有办法通过用户控件禁用主窗体上的按钮,c#,winforms,C#,Winforms,我试图使用主窗口面板中的用户控件禁用主窗体上的一些按钮。我认为这段代码不起作用是因为继承 MainWindow mW = new MainWindow(); mW.button1.Enabled = false; mW.button2.Enabled = false; mW.button3.Enabled = false; mW.button4.Enabled = false; mW.button5.Enabled = false; mW.button6.Enabled = false; mW.
MainWindow mW = new MainWindow();
mW.button1.Enabled = false;
mW.button2.Enabled = false;
mW.button3.Enabled = false;
mW.button4.Enabled = false;
mW.button5.Enabled = false;
mW.button6.Enabled = false;
mW.button7.Enabled = false;
请建议其他方法。您可以使用
this.FindForm()
获取对包含用户控件的表单的引用,将该引用转换回MainForm
,并控制MainForm
上的按钮(假设它们是内部的或公共的)。
然而,这样做可能是错误的
更好的方法是在用户控件中创建事件,将主窗体列为该事件,然后在事件处理程序中更改主窗体中的任何内容。
这样,您的用户控件就不会绑定到特定的表单,您也可以在其他表单中重用它
您可以继承EventArgs
类来发送事件的特定数据-在本例中,是一个布尔值,指示按钮应启用还是禁用:
public class MyEventArgs : EventArgs
{
public MyEventArgs(bool enable)
{
Enable = enable;
}
public bool Enable {get;}
}
然后,在用户控件中:
public event EventHandler<MyEventArgs> SomethingHappened;
// to raise it:
SomethingHappend?.Invoke();
在事件处理程序中,您可以启用/禁用按钮:
private void MyUserControl_SomethingHappened(object sender, MyEventArgs e)
{
button1.Enabled = e.Enable;
button2.Enabled = e.Enable;
...
button7.Enabled = e.Enable;
}
这段代码是在哪里写的?您应该使用显示的MainWindow实例,而不是创建新实例。此代码在用户控件中的按钮中编写。您正在创建MainWindow实例,然后禁用该实例的按钮。它肯定会完成预期的工作。如果对其调用Show()函数,按钮将被禁用如果控件位于要影响的窗体上,如何创建新窗体帮助?您需要访问现有表单。您可以调用用户控件的FindForm
方法,或者,如果它直接放在表单上,则可以通过Parent
属性访问它。不过,这不是最佳做法。正确的方法是,用户控件引发一个窗体可以处理的事件,然后窗体可以禁用自己的按钮@kamakadze,因此此代码将写入主窗口按钮的click事件处理程序?如果是这样的话,那么只需将mW.button…
替换为this.button…
谢谢,我一定会尝试,因为这是最好的做法,但同时我的时间很短,所以我使用了这样的控制方法Control[]Co=this.TopLevelControl.Controls.Find(“pInfo”,true);Co[0]。已启用=错误代码>谢谢大家的帮助。
private void MyUserControl_SomethingHappened(object sender, MyEventArgs e)
{
button1.Enabled = e.Enable;
button2.Enabled = e.Enable;
...
button7.Enabled = e.Enable;
}