hi form1中的form2呼叫事件?form1中的form2呼叫事件
例如:
下面的代码到窗口2:
private void Form2_Load(object sender, EventArgs e)
{
MessageBox.Show("http://stackoverflow.com");
}
什么在Form1中写?
hi form1中的form2呼叫事件?form1中的form2呼叫事件
例如:
下面的代码到窗口2:
private void Form2_Load(object sender, EventArgs e)
{
MessageBox.Show("http://stackoverflow.com");
}
什么在Form1中写?
form2.Form2_Load(this, null)
你为什么想打电话给这个事件?你会知道发件人和事件参数吗?
为什么不在Form1中创建Form1能够看到的公共方法?
您无法从外部调用某个班级的私人成员。
如果您的form1
位于同一装配体中,您可以将可访问性更改为internal
,这将使其在装配体内可见。
或者,您可以将其设置为public
方法,这将使其可以全局访问。
但是,您不应该以这种方式调用事件处理函数 - 它们应该处理声明类引发的事件。
你给的示例代码,一个更好的解决办法是建立一个公开或内部的方法,可以从该事件处理函数中调用:
private void Form2_Load(object sender, EventArgs e)
{
MyMethod();
}
public MyMethod()
{
MessageBox.Show("http://stackoverflow.com");
}
为了从form1
调用这个方法,它需要要知道的关于form2
:
// in form1
Form frm2 = new Form2();
frm2.MyMethod();
这是一个原则性的方式? – 2010-10-01 22:26:32
你是什么意思的“原则方式”? – Oded 2010-10-02 09:27:43
您不能从课外举办活动。 约定是你在类中调用OnEventname
方法。通常这个方法是受保护
// in form1
private void Method1()
{
using (var form2 = new Form2())
{
form2.Show();
form2.RaiseLoadEvent(EventArgs.Empty);
}
}
// Create this method in form2
public void RaiseLoadEvent(EventArgs e)
{
OnLoad(this, e);
}
// The OnLoad method already exists in form 2
// But it usually looks like this
protected void OnLoad(EventArgs e)
{
var eh = LoadEventHandler;
if (eh != null)
{
eh(this, e);
}
}
(不仅可以从类本身或他人从它继承访问),但我不建议提高比如LoadEvent,因为它创建后引发一次表格。更常见的是对Load事件做出反应以修改表单。
privat void Method1()
{
using (var form2 = new Form2())
{
// Add Event Handler
form2.Load += new EventHandler(form2_Load);
form2.ShowDialog();
}
// Allways remove Event Handler to avoid memory leaks
form2.Load -= new EventHandler(form2_Load);
}
private void form2_Load(object sender, EventArgs e)
{
form2.Text = "Hello from form1";
}
Form1(事件发布者)应为Form2(订户)公开一个单独的公共事件属性来订阅。
例如:形式发布该事件将是这样的:
public partial class Publisher : Form
{
public event PostUpdateHandler OnPostUpdate;
public Publisher()
{
InitializeComponent();
new Subscriber(this).Show();
}
private void button1_Click(object sender, EventArgs e)
{
if (OnPostUpdate != null)
{
OnPostUpdate(new PostUpdateArgs(textBox1.Text));
}
}
}
public delegate void PostUpdateHandler(PostUpdateArgs args);
public class PostUpdateArgs : EventArgs
{
public string UpdateText;
public PostUpdateArgs(string s)
{
UpdateText = s;
}
}
的订阅形式如下:
公共部分类用户:形式 { 公众认购() { InitializeComponent(); }
public Subscriber(Publisher publisher) : this()
{
publisher.OnPostUpdate += new PostUpdateHandler(publisher_OnPostUpdate);
}
private void publisher_OnPostUpdate(PostUpdateArgs args)
{
this.Form2_Load(null, null);
}
private void Subscriber_FormClosed(object sender, FormClosedEventArgs e)
{
this.Dispose();
}
private void Form2_Load(object sender, EventArgs e)
{
MessageBox.Show("http://stackoverflow.com");
}
}
当用户按下按钮1发布形式,订阅形式将执行与委托相关联的代码,从而在消息框中与消息http://stackoverflow.com
弹出。
这是一种私人方法。他不能从课堂外打电话给他。 – Oded 2010-10-01 19:47:30
哎呀...我的错误... – Viv 2010-10-01 19:52:32