C# 从其用户控件调用Windows窗体方法
我的windows窗体上有一个用户控件,在我的用户控件上有一个按钮,单击该按钮我想调用其窗体方法C# 从其用户控件调用Windows窗体方法,c#,.net,C#,.net,我的windows窗体上有一个用户控件,在我的用户控件上有一个按钮,单击该按钮我想调用其窗体方法 Thanx提供您自己的公共单击用户控件上的事件,并以使用该控件的形式订阅此事件 public class MyControl : UserControl { // ... public event EventHandler Click; // ... } 处理按钮的单击,然后将其转发给公共click事件处理程序: protected void button1_Click
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这仍然是一个很好的答案,因为它诱使其他人发布更成熟的方法。我有一个用户控件,我使用它来填充一个表单上的选项卡。我不明白为什么没有很好的理由说明用户控件应该与特定表单紧密耦合。
我的理由已经足够好了。非常好。非常简单的解决方案。