通过访问控制在表单中启用按钮

时间:2012-10-23 04:31:58

标签: c# winforms

  

可能重复:
  Get access to parent control from user control - C#

我的表单btnMessage上有Main,我也有用户控制权(uc)。

当我点击btnMessage时,会打开uc并生成btnMessage.enabled = false。在uc中,有一个名为btnExecute的按钮。

我想要的是,当我点击btnExecute中的uc时,btnMessage表格中的Main将被停用。我怎么能这样做?

以下是更新代码:

我正在使用main.cs

中的功能
    public Main()
    {
        InitializeComponent();
        formFunctionPointer += new functioncall(buttonHideorEnabled);
        ucMessageTarget.userFunctionPointer = formFunctionPointer;
    }

    public delegate void functioncall(bool _status);

    private event functioncall formFunctionPointer;

    public void buttonHideorEnabled(bool _status)
    {
        btnMessageTarget.Enabled = _status;
    }

uc.cs

    public static string agentName = UtilitiesToolkit.agentMessageTarget;
    public static string strn;

    public UcMessageTarget(string str)
    {
        InitializeComponent();
        strn = str;
    }

    public Delegate userControlPointer;
    public Delegate userFunctionPointer;
    private void btnExecute_Click(object sender, EventArgs e)
    {
       btnExecute.enabled = false;
       userFunctionPointer.DynamicInvoke(false);
       //I want btnMessage in Main form also disabled, please tell me how
    }

但是,仍然没有奏效。当我编译时,我在main中有错误,在这一行:

    public Main()
    {
        InitializeComponent();
        formFunctionPointer += new functioncall(buttonHideorEnabled);
        ucMessageTarget.userFunctionPointer = formFunctionPointer;
    }

说,那个

  

对象引用未设置为对象的实例(in   ucMessageTarget.userFunctionPointer = formFunctionPointer;)。

请帮忙。

2 个答案:

答案 0 :(得分:1)

您可以在代码隐藏中以编程方式订阅事件处理程序,因此在“子”表单的按钮的“父”表单中添加一个:

uc.btnExecute.Click += new EventHandler(name_of_method_to_handle_click_event);

唯一的要求是控件为public,以便父窗体可以访问它。

答案 1 :(得分:0)

我宁愿做的是从主窗体监听的用户控件中引发一个事件,然后在此事件处理程序中禁用该按钮。

User Control Events in VB and C#

这样的东西

这将避免用户控制必须“知道”关于调用者的任何内容(父窗体)。

在SO上搜索一下,你会发现很多从用户控件中引发事件的例子。