使用program.cs引用form1中的form2有错误

时间:2013-11-09 14:26:56

标签: c#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;

namespace Test
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        public static Form1 f;
        public static Form2 f2;
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);
            Application.Run(new Form1());
            f = new Form1();
            f2 = new Form2();
        }
    }
}
private void button1_Click(object sender, EventArgs e)
{
 Program.f2.Show();

this.Hide();     }

该按钮提供“对象引用未设置为对象的实例”。错误。我该如何解决?我的代码中没有看到任何错误。

2 个答案:

答案 0 :(得分:0)

错误:

  

“对象引用未设置为对象的实例。”

意味着您正在尝试调用的对象尚未初始化,您正在调用f2.Show();,但您必须在调用它之前对其进行初始化。

您应初始化Form2,然后使用您提供的名称调用它。

替换:

private void button1_Click(object sender, EventArgs e)
{
   Program.f2.Show();
   this.Hide(); 
}

使用:

 private void button1_Click(object sender, EventArgs e)
 {
     var f2 = new Form2();
     f2.Show();
     this.Hide();
 }

答案 1 :(得分:0)

问题在于技术上:

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
        f = new Form1();
        f2 = new Form2();

Application.Run()实际上会阻塞,直到主窗体关闭,因此下面的两行(初始化表单的地方)永远不会运行。要“修复”它,你需要移动这些线:

        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        f = new Form1();
        f2 = new Form2();
        Application.Run(new Form1());

看起来您希望“f”成为对Form1的引用,因此您应该将其传递给Application.Run():

        f = new Form1();
        f2 = new Form2();
        Application.Run(f);

我会将这些实例包装在属性中,因此您可以确保它们被正确实例化(例如,当您关闭Form2并尝试再次重新打开它时)。这可能看起来像这样:

static class Program
{
    /// <summary>
    /// The main entry point for the application.
    /// </summary>
    private static Form1 f1;
    private static Form2 f2;

    public static Form1 F1
    {
        get
        {
            if (f1 == null || f1.IsDisposed)
            {
                f1 = new Form1();
            }
            return f1;
        }
    }

    public static Form2 F2
    {
        get
        {
            if (f2 == null || f2.IsDisposed)
            {
                f2 = new Form2();
            }
            return f2;
        }
    }

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(Program.F1);
    }

}

然后在Form1中:

    private void button1_Click(object sender, EventArgs e)
    {
        Program.F2.Show();
    }