我正在编写一个应用程序,它以固定的间隔(使用计时器)将gps数据从主窗体传递到gps窗体。
我已使用以下教程进行快速测试:
http://www.codeproject.com/Articles/17371/Passing-Data-between-Windows-Forms
但是,当我启动代码时,不会触发任何事件。首先我得到了一个nullpointer。在添加以下行后,我摆脱了它:
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());
}
}
有人能指出我正确的方向吗?我做错了什么?
提前致谢,并表示最诚挚的问候。
答案 0 :(得分:2)
您应该将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;
}
注意如何使用自引用Form1
在Form_GPS
的构造函数中将Form_GPS
的实例传递给this
。
答案 1 :(得分:0)
将事件声明为以下解决了问题:
public static event GpsUpdateHandler GpsUpdated;
而不是:
public event GpsUpdateHandler GpsUpdated;
通过这种方式,Form1事件可以被称为static,因此不需要新的实例。