0

ログイン画面で起動するWinformsアプリケーションがあります。ユーザーのログイン資格情報が適切である場合、このメソッドは次のように呼び出されます。

public void success()
{
    mainForm index = new mainForm();
    index.Show();
    this.Close();
}

これでログインフォームが開いてmainForm閉じると思いましたが、これを実行するとアプリケーション全体が閉じてしまいます。何故ですか?私は一般的にC#とOOPにかなり慣れていないので、ヒントをいただければ幸いです。

私は次のようなことを試みました: フォームを閉じてから別のフォームを呼び出す

しかし、それでも同じ結果が得られました。

ありがとう :)

4

5 に答える 5

2

それを好きにしてください:

static class Program
 {
  /// <summary>
  /// The main entry point for the application.
  /// </summary>
  [STAThread]
  static void Main()
  {   
    using (Login login = new Login())
    {
     login.StartPosition = FormStartPosition.CenterScreen;
     if (login.ShowDialog() == DialogResult.OK)
     {      
      Application.Run(new Form1(login.strUserName)); //passing the userName to the constructor of form1 (see bellow)
     }
   }
  }
 }

//form1:
 public partial class Form1 : Form
 {  
  string userName; 
  public Form1(string _strUser)
  {   
   InitializeComponent();
   userName = _userName; //a local variable of a form1 class has hold user`s name (userName - which u can call it from within the form1 class!
  }
 }
于 2012-04-12T15:37:38.283 に答える
1

他の質問で説明したように、アプリケーションのメインウィンドウ(つまり、に渡されたウィンドウApplication.Run())を閉じることはできません。

これを解決するには、のインスタンスをに渡し、開いたときにログインダイアログを表示mainFormApplication.Run()せます。mainForm

于 2012-04-12T15:39:20.000 に答える
1

ログイン フォームをスタートアップ フォームとして設定するのではなく、Program.cs に移動することをお勧めします。詳細はこちら:アプリケーションを閉じずにログイン フォームを閉じてメイン フォームを表示するにはどうすればよいですか?

別の解決策は、ユーザーが正常にログインした後にログイン フォームを非表示にして新しいフォームを開き、メイン ウィンドウが閉じたときにイベントを使用してログイン フォーム (非表示になる) を閉じることです。

于 2012-04-12T15:41:49.890 に答える
1

ここでの回答はいくつかの解決策を説明していますが、問題を明確にするために、MSDNのApplication.Run メソッド (フォーム)を参照してください。それは述べています:

このメソッドは、Closed イベントの mainForm パラメータにイベント ハンドラを追加します。イベント ハンドラーは ExitThread を呼び出して、アプリケーションをクリーンアップします。

したがって、ログイン ボックスから開始しているため、閉じるとすぐに ExitThread が起動され、アプリケーションが閉じられます。私が言ったように、ここでの他の回答は、 Main() でログインボックスを直接作成するか、メインフォームを開始してログインボックスの表示を管理するなど、この問題を回避するいくつかの方法を示しています。

于 2012-04-12T16:25:38.873 に答える
0

あなたの質問に答えるために:それはどんな変数でもありえます。これは私が作った変数です。どこから来たのか:実際にはログインフォームから来ています。プライベートセッターがあり、ログインフォームでのみ設定できるパブリックプロパティがあります。私のコードからわかるように、私はそれを取得します:

Application.Run(new Form1(login.strUserName)); 

ログインはログインフォームのリファレンスです。そのため、ログインフォームからプログラム(すべてが開始された場所)、およびForm1に変数strUserNameを「転送」するだけなので、そこで表示できます。 なぜ転送する必要があるのですか、また、Form1から単純にアクセスできないのはなぜですか? これは、コードがForm1になると、ログインフォームはすでに破棄されており、ログインのすべてのメンバーがnullに設定されている(アクセスできない)ためです。Loginクラスをインスタンス化したとき、ブロックを使用してそれを実行したことがわかります。したがって、コードがそれを離れるとき、クラスもそれを破棄します。

ところで、ログインフォームは次のようになります:

class Login
{
   public string strUserName { get; private set; }
}

それが理解に役立つことを願っています。さよなら

于 2012-04-13T05:57:28.973 に答える