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(); }
该按钮提供“对象引用未设置为对象的实例”。错误。我该如何解决?我的代码中没有看到任何错误。
答案 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();
}