在表单之间传递数据(未触发事件)

本文关键字:事件 数据 表单 之间 | 更新日期: 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的构造函数中使用自引用thisForm1的实例传递给Form_GPS

这样声明事件就解决了问题:

public static event GpsUpdateHandler GpsUpdated;

代替:

public event GpsUpdateHandler GpsUpdated;

通过这种方式,Form1事件可以被称为静态的,因此不需要新的实例。