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;
}