Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从其用户控件调用Windows窗体方法_C#_.net - Fatal编程技术网

C# 从其用户控件调用Windows窗体方法

C# 从其用户控件调用Windows窗体方法,c#,.net,C#,.net,我的windows窗体上有一个用户控件,在我的用户控件上有一个按钮,单击该按钮我想调用其窗体方法 Thanx提供您自己的公共单击用户控件上的事件,并以使用该控件的形式订阅此事件 public class MyControl : UserControl { // ... public event EventHandler Click; // ... } 处理按钮的单击,然后将其转发给公共click事件处理程序: protected void button1_Click

我的windows窗体上有一个用户控件,在我的用户控件上有一个按钮,单击该按钮我想调用其窗体方法


Thanx提供您自己的公共
单击用户控件上的事件,并以使用该控件的形式订阅此事件

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

重新思考你的方法。如果用户控件和表单都共享一个横切控件,则不要将其代码放在表单上。从本质上讲,用户控件可以跨多个表单共享,因此没有充分的理由说明用户控件应该与特定表单紧密耦合

将代码移动到共享库/类中,并通过用户控件上的“偶数”按钮访问它。这样,用户控件将不关心它在哪个窗体上

也就是说,如果确实需要从窗体访问用户控件,请在运行时将窗体的实例传递到控件中:

protected void Form_Load(object sender, EventArgse)
{
    myUserControl.MainForm = this;
}
然后,您可以从usercontrol的
MainForm
参考访问MainForm上的公共属性/方法:

protected void MyButton_Click(object sender, EventArgs e)
{
    MainForm.Foo();
}
将调用
MainForm
实例中的
Foo
方法


(我已经有一段时间没有使用WinForms了——因此事件处理程序的方法签名可能有点偏离,但一般原则应该适用)。

对我有效的是使用委托

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

如果只需要调用表单接口提供的方法,则只需调用即可检索控件所在的表单

Form form = this.FindForm();
form.Close();
如果已知基础表单,则可以执行以下操作:

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

为什么投票被否决?这可能是一个常见的初学者问题,也是其背后的一个重要范例(基于事件的编码)。如果你使用@Uwe的答案,你应该投票认为它是正确的,而不是发布你自己的答案:)是的,刚刚看到他的答案,我的问题不是调用表单事件方法,我想用传递给它的值调用一个普通方法。顺便说一句,我对Uwe的答案投了赞成票:)只要对你的问题投赞成票,很可能更多的人也投反对票。不必要,因为用户控件有ParentForm属性,所以((Form1)this.ParentForm).eggsmethod()可以工作。即使如此,也不建议这样做:它使用户控件不可重用。+1这仍然是一个很好的答案,因为它诱使其他人发布更成熟的方法。我有一个用户控件,我使用它来填充一个表单上的选项卡。我不明白为什么
没有很好的理由说明用户控件应该与特定表单紧密耦合。
我的理由已经足够好了。非常好。非常简单的解决方案。