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() は実際にはメイン フォームが閉じられるまでブロックされるため、下の 2 行 (フォームを初期化する場所) は実行されません。それを「修正」するには、これらの行を上に移動する必要があります。

        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

エラー:

"オブジェクト参照がオブジェクト インスタンスに設定されていません。"

u を呼び出そうとしているオブジェクトがまだ初期化されていないことを意味します。あなたは を呼び出して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 に答える