1

すべてのフォームは基本フォーム ("Base") から継承します。

そこで、初期化するときに、現在のユーザーのアクセス権限に基づいて true または false を返す「Acceso」(アクセス) というメソッドを呼び出します。

public Base()
    {
        InitializeComponent();
        Acceso();
    }

public void Acceso()
    {
        Type tipo = this.GetType();
        if (Metodos.Login.Acceso(tipo) == false)
        {
            WMessageBox.Show("Su usuario no posee los privilegios necesarios para acceder a esta ventana.", "Error", 2, false);
            this.Close();
            this.Dispose();
        }
    }

問題は、false が返された場合、フォームは完全に閉じますが、その後例外が発生することです。どうやら、フォームは引き続き実行されます。これを処分して解決しようとしましたが、同じ問題が発生しました。

フォームを終了するにはどうすればよいですか? インスタンスを停止して破棄する方法はありますか?

EDIT:削除されたフォームを表示したいので、実際にこれが起こっています。

form.Show();

この質問を書いたのは、別の形で同じことが起こっていると思ったからです。

そのフォームには、UserControls をロードするパネルがあります。UserControl のインスタンスを作成してパネルに追加するときは、フォームを UserControl の Form タイプ変数に割り当てます。これは、ユーザーがその UserControl で例外を受け取った場合、form.Close() を実行してフォーム全体を閉じるためです。

これは、UserControl (ボタン内) をロードする方法です。

 private void btn_Administracion_grupos_Click(object sender, EventArgs e)
    {
        Dispose_User_Control();
        ABM.frm_Administracion_Grupos administracion_grupos = new ABM.frm_Administracion_Grupos();
        administracion_grupos.form = this;
        pnl_UserControl.Controls.Add(administracion_grupos);
    }

administracion_grupos はフォームです。

Dispose_User_Control() で、パネルから UserControl を削除して破棄します。

public void Dispose_User_Control()
    {
        if (pnl_UserControl.Controls.Count > 0)
        {
            try
            {
                UserControl frm = (UserControl)pnl_UserControl.Controls[0];
                frm.Dispose();
            }
            catch
            {

            }

            pnl_UserControl.Controls.Clear();
        }
    }

次に、FormClosing() イベントで、パネルとフォームに UserControl を配置します。

private void frm_Configuracion_FormClosing(object sender, FormClosingEventArgs e)
    {
        Dispose_User_Control();
        this.Dispose();
    }

UserControl で例外が発生した場合は、次のようにします。

try
            {
                db.SaveChanges();
                WMessageBox.Show("Grupo guardado con éxito.", "Confirmación", 3, false);
            }
            catch(Exception excep)
            {
                Control.Mensajes_error.Error_transaccion(excep);
                form.Close();
            }

私はそれを受け入れ、フォーム(パネルのあるフォーム)を閉じます。

しかし、閉じた後 (フォームはもう表示されません)、UserControl 内のコード行で例外が発生します。そのため、フォーム全体を終了する方法が必要でした。

私が取得している例外は、データグリッドビューを使用しているコード行にあります。null参照と言うだけです。次に、私が言ったように、メイン フォームは閉じられ、UserControls は破棄されますが、コードの実行は続行されます。

4

1 に答える 1

1

そのためにEnvironment.Exitメソッドを使用できます

于 2013-02-28T18:45:02.233 に答える