5

メイン フォームである MDIPrent フォームが 1 つあります。LogOut MenuStrip をクリックして Main_Form からログアウトします。私のコードでは、インスタンスの重複を防ぎました。しかし、私はこのエラーが発生します。私は非常に多くのことを試しましたが、エラーは消えません。以下は、Program.cs ファイルのコードです。

using System.Diagnostics;
static class Program
{
    [STAThread]
    static void Main()
    {
        LoggedInUser = string.Empty;
        loginSuccess = false;
        String thisprocessname = Process.GetCurrentProcess().ProcessName;
        if (Process.GetProcesses().Count(p => p.ProcessName == thisprocessname) > 1)
            return;
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        MyApplicationContext context = new MyApplicationContext();
        Application.Run(context);

    }
    public class MyApplicationContext : ApplicationContext
    {
        private Login_Form lgFrm = new Login_Form();
        public MyApplicationContext()
        {
                try
                {
                    lgFrm.ShowDialog();
                    if (lgFrm.LogonSuccessful)
                    {
                        ////lgFrm.Close();
                        lgFrm.Dispose();
                        FormCollection frm = Application.OpenForms;
                        try
                        {
                            foreach (Form fc in frm)
                                fc.Close();
                        }
                        catch (Exception ex){}
                        Application.Run(new Main_Form());
                    }
                }
                catch (Exception ex){}
            }
        }
}

以下は Login_Form のコードです

public bool LogonSuccessful
    {
        get
        {
            return Program.loginSuccess;
        }

        set
        {
            Program.loginSuccess = value;
        }
    }

    private void BtnEnter_Click(object sender, EventArgs e)
    {
        Login_Form lgn = new Login_Form();
        Program.loginSuccess = true;
        this.Hide();
        Program.LoggedInUser = TxtBxUserName.Text;
    }

以下はMain_Form用です

private void LogOutMenuItem_Click(object sender, EventArgs e)
    {
        Login_Form lgFrm = new Login_Form();
        lgFrm.LogonSuccessful = false;
        Program.loggedOut = true;
        Program.LoggedInUser = string.Empty;
        this.Close();
        ////FormCollection frm = Application.OpenForms;

        ////foreach (Form fc in frm)
        ////{
        ////    MessageBox.Show(fc.ToString());
        ////}

        Program.MyApplicationContext context = new Program.MyApplicationContext();
        Application.Run(context);
    }

アプリケーションの唯一の OpenForm である Main_Form を作成したいので、コンテキストを使用しました。どこかで、コンテキストを使用するというアイデアを思いつきました。

4

3 に答える 3

4

あなたの例外は、Application.Run(...)別の内部で呼び出すためです。次のApplication.Run(...)ように変更します。

//MyApplicationContext constructor
public MyApplicationContext()
    {
            try
            {
                lgFrm.ShowDialog();
                if (lgFrm.LogonSuccessful)
                {
                    ////lgFrm.Close();
                    lgFrm.Dispose();
                    FormCollection frm = Application.OpenForms;
                    try
                    {
                        foreach (Form fc in frm)
                            fc.Close();
                    }
                    catch (Exception ex){}
                    //Application.Run(new Main_Form());  <<<---- Remove this
                    MainForm = new Main_Form();
                }
            }
            catch (Exception ex){}
            //Add the ThreadExit event handler here
            ThreadExit += (s,e) => {
              if(Program.loggedOut) {
                Program.MyApplicationContext ctxt = new Program.MyApplicationContext();
                Application.Run(ctxt);
              }
            };
       }
     }
 //
 private void LogOutMenuItem_Click(object sender, EventArgs e)
 {
    Login_Form lgFrm = new Login_Form();
    lgFrm.LogonSuccessful = false;
    Program.loggedOut = true;
    Program.LoggedInUser = string.Empty;
    this.Close();  //I think you want to call Application.Restart() here?
                   //if so, you don't need the ThreadExit event handler added in the MyApplicationContext() constructor.   
 }
于 2013-08-04T14:06:12.023 に答える
0

私は同じ問題を抱えていました

これを解決する最善の方法は

Application.Restart();

ユーザーがログアウトするたびに使用する必要があるため、メインUIが閉じます

ログインダイアログが表示されます!!

ただし、ログインフォームUではこれを使用する必要があります

ControlBox = False;

ユーザーはそれを閉じてバイパスすることはできません!! U だけで、コードを使用して終了ボタンを追加できます

Application.Exit();

これは、追加の使用法やエラーなしでこの問題を解決した方法です...

于 2013-11-02T06:22:02.770 に答える
0

これを試してください: ログオフ時に新しいアプリケーションを起動する代わりに、ウィンドウを破棄MyApplicationContext()してこれを置き換えます:

    public MyApplicationContext()
    {
       bool isSuccessful = false;
       do
       {
            try
            {
                lgFrm = new Login_Form();
                lgFrm.ShowDialog();
                if (lgFrm.LogonSuccessful)
                {
                    isSuccessful = lgFrm.LogonSuccessful;
                    ////lgFrm.Close();
                    lgFrm.Dispose();
                    FormCollection frm = Application.OpenForms;
                    try
                    {
                        foreach (Form fc in frm)
                            fc.Close();
                    }
                    catch (Exception ex){}
                    Application.Run(new Main_Form());
                }
            }
            catch (Exception ex){}
        }while(isSuccessful);
    }
于 2013-08-04T13:33:17.663 に答える