从其他Windows窗体访问菜单条

时间:2015-06-01 20:06:00

标签: c# winforms

我想从form2form3

停用我的菜单条或子菜单条

问题是菜单条是私有的。我无法从可以更改值的其他表单访问它。我怎么能这样做?

enter image description here

1 个答案:

答案 0 :(得分:0)

请勿尝试从外部访问表单的私人控件,而不要制作您的菜单public - 它不是您问题的正确解决方案。如果您将控件公开,则允许其他组件访问这些控件而无法进行干预 - 外部调用者可以在不知道表单的情况下更改表单的状态。这可能适用于非常小的程序,但由于各种UI元素相互依赖,因此会导致代码在增长时无法维护:当您更改一个时,您必须更新代码其他组件,以保持建设没有错误。如果不破坏功能,这很难做到。

如果您需要从另一个表单影响一个表单,正确的方法是获取目标表单的临时引用(最好只是一个接口),然后告诉目标表单停用它自己的菜单。

这使菜单成为私有组件(应该如此),但仍然可以告诉目标表单更新菜单的状态。

例如:

// Form1.Designer.cs
partial class Form1
{
    private System.Windows.Forms.ContextMenuStrip contextMenuStrip1;

    // ...
}

// Form with menu
public partial class Form1 : Form
{
    public void UpdateMenuStatus ( bool bEnable )
    {
        // update menu status here
    }
}

// Form that wants to update the menu on Form1
public partial class Form2 : Form
{
    private void SomeFunc ()
    {
        Form1 form1 = GetForm1Reference ();

        form1.UpdateMenuStatus ( true );
    }
}

函数GetForm1Reference ()应该在您维护的全局列表/地图中查找请求的Form1引用 - 这样您就不会在其他表单中对表单的特定实例进行硬编码 - 你希望保持这些不同的形式尽可能彼此分开,以便改变一种形式并不会迫使你改变其他形式。