1

可能重复:
从用户控件获取对父控件的访问权限 - C#

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

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

我想要的是,当我点击btnExecutein时uc,表单将被禁用。我怎么能做到这一点?btnMessageMain

这是更新代码:

我正在使用函数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;
    }

说,那个

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

请帮忙。

4

2 回答 2

1

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

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

唯一的要求是控件必须public使父窗体可以访问它。

于 2012-10-23T04:41:59.980 回答
0

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

类似于VB 和 C# 中的用户控制事件

这将避免用户控件必须“了解”有关调用者(父窗体)的任何信息。

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

于 2012-10-23T04:35:39.220 回答