从用户控件调用Windows窗体方法

时间:2011-06-02 07:44:27

标签: c# .net

我的Windows窗体上有一个用户控件,我的用户控件上有一个按钮,点击我要调用它的窗体方法。

感谢名单

4 个答案:

答案 0 :(得分:6)

对我有用的是使用委托

 public delegate void ClickMe (string message);
public partial class CustomControl : UserControl
{
    public event ClickMe CustomControlClickMe;
    public CustomControl()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        if (CustomControlClickMe != null)
            CustomControlClickMe("Hello");
    }


public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();
        customControl1.CustomControlClickMe += new ClickMe(button2_Click);
    }

    void button2_Click(string message)
    {
        MessageBox.Show(message);
    }

答案 1 :(得分:4)

在您的用户控件上提供您自己的公开Click事件,并以使用该控件的形式订阅此事件。

public class MyControl : UserControl
{
    // ...

    public event EventHandler Click;

    // ...
}

处理按钮的点击,然后将其转发给公共Click事件处理程序:

protected void button1_Click( object sender, EventArgs args )
{
    var h = Click;
    if ( h != null )
    {
        h( this, args );
    }
}

答案 2 :(得分:0)

重新思考你的方法。如果存在由用户控件和表单共享的横切conern,请不要将其代码放在表单上。从本质上讲,用户控件可以在多个表单之间共享,并且没有充分理由将用户控件紧密耦合到特定表单。

将代码移动到共享库/类中,并通过单击用户控件上的按钮来访问它。这样,用户控件将不关心它所处的形式。

也就是说,如果确实需要从表单访问用户控件,请在运行时将表单实例传递给控件:

protected void Form_Load(object sender, EventArgse)
{
    myUserControl.MainForm = this;
}

然后,您可以从usercontrol的MainForm引用访问MainForm上的公共属性/方法:

protected void MyButton_Click(object sender, EventArgs e)
{
    MainForm.Foo();
}

将调用Foo实例中的MainForm方法。

(自从我使用WinForms以来已经有一段时间了 - 所以事件处理程序的方法签名可能略有偏差,但一般原则应该适用。)

答案 3 :(得分:0)

如果您只需要调用Form界面提供的方法,只需调用FindForm即可检索控件所在的表单。

Form form = this.FindForm();
form.Close();

如果已知基础表格,您可以这样做:

MyForm form = (MyForm)this.FindForm();
form.DoSomething();