0
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(); }

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

4

2 回答 2

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();
    }
于 2013-11-09T17:22:39.663 回答
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();
 }
于 2013-11-09T14:28:43.917 回答