在表单之间传递数据(未触发事件)
本文关键字:事件 数据 表单 之间 | 更新日期: 2023-09-27 18:18:58
我正在编写一个应用程序,将gps数据从主要形式传递到gps形式,以恒定的间隔(使用计时器)。
我使用下面的教程做了一个快速测试:
http://www.codeproject.com/Articles/17371/Passing-Data-between-Windows-Forms但是,当我启动代码时,没有触发任何事件。首先是一个空指针。添加以下行后,我去掉了它:
if (GpsUpdated != null)
{
GpsUpdated(this, args);
}
主表单代码:
public partial class Form1 : Form
{
// add a delegate
public delegate void GpsUpdateHandler(object sender, GpsUpdateEventArgs e);
// add an event of the delegate type
public event GpsUpdateHandler GpsUpdated;
int lat = 1;
public Form1()
{
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e)
{
Form_GPS form_gps = new Form_GPS();
form_gps.Show();
timer1.Enabled = true;
}
private void timer1_Tick(object sender, EventArgs e)
{
Debug.WriteLine("Timer Tick");
// instance the event args and pass it each value
GpsUpdateEventArgs args = new GpsUpdateEventArgs(lat);
// raise the event with the updated arguments
if (GpsUpdated != null)
{
GpsUpdated(this, args);
}
}
}
public class GpsUpdateEventArgs : EventArgs
{
private int lat;
// class constructor
public GpsUpdateEventArgs(int _lat)
{
this.lat = _lat;
}
// Properties - Viewable by each listener
public int Lat
{
get
{
return lat;
}
}
}
GPS表单代码:
public partial class Form_GPS : Form
{
public Form_GPS()
{
InitializeComponent();
}
private void Form_GPS_Load(object sender, EventArgs e)
{
Debug.WriteLine("GPS Form loaded");
Form1 f = new Form1();
// Add an event handler to update this form
// when the ID form is updated (when
// GPSUpdated fires).
f.GpsUpdated += new Form1.GpsUpdateHandler(gps_updated);
}
// handles the event from Form1
private void gps_updated(object sender,GpsUpdateEventArgs e)
{
Debug.WriteLine("Event fired");
Debug.WriteLine(e.Lat.ToString());
}
}
谁能给我指个正确的方向?我做错了什么?提前致谢,并致以最诚挚的问候。
您应该将Form1
的实例传递给Form_GPS
以使其正常工作。查看以下更改:
public partial class Form_GPS : Form
{
public Form_GPS(Form1 owner)
{
InitializeComponent();
owner.GpsUpdated += new Form1.GpsUpdateHandler(gps_updated);
}
private void Form_GPS_Load(object sender, EventArgs e)
{
Debug.WriteLine("GPS Form loaded");
}
// handles the event from Form1
private void gps_updated(object sender,GpsUpdateEventArgs e)
{
Debug.WriteLine("Event fired");
Debug.WriteLine(e.Lat.ToString());
}
}
现在你需要在Form1
也做一个小的改变:
private void Form1_Load(object sender, EventArgs e)
{
Form_GPS form_gps = new Form_GPS(this);
form_gps.Show();
timer1.Enabled = true;
}
请注意如何在Form_GPS
的构造函数中使用自引用this
将Form1
的实例传递给Form_GPS
。
这样声明事件就解决了问题:
public static event GpsUpdateHandler GpsUpdated;
代替:
public event GpsUpdateHandler GpsUpdated;
通过这种方式,Form1事件可以被称为静态的,因此不需要新的实例。