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

时间:2014-08-20 09:44:10

标签: c# winforms

我正在编写一个应用程序,它以固定的间隔(使用计时器)将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());
    }
}

有人能指出我正确的方向吗?我做错了什么?

提前致谢,并表示最诚挚的问候。

2 个答案:

答案 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;
}

注意如何使用自引用Form1Form_GPS的构造函数中将Form_GPS的实例传递给this

答案 1 :(得分:0)

将事件声明为以下解决了问题:

public static event GpsUpdateHandler GpsUpdated;

而不是:

public event GpsUpdateHandler GpsUpdated;

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