web-dev-qa-db-ja.com

C#でフォームを閉じる方法

それでは、Windows Formsクラス、WindowSettings、およびフォームには「キャンセル」ボタンがあります。ユーザーがボタンをクリックすると、DialogSettingsCancelダイアログがポップアップ表示され、アクションを実行するかどうかを確認します。ダイアログには、[はい]ボタンと[いいえ]ボタンの2つのボタンがあります。ユーザーが「はい」ボタンをクリックした場合、DialogSettingsCancelとWindowSettingsの両方を閉じます。

DialogSettingsCancelの私のbutton_Clickイベントハンドラー:

private void button1_Click(object sender, EventArgs e)
{
    //Code to trigger when the "Yes"-button is pressed.
    WindowSettings settings = new WindowSettings();
    this.Close();
    settings.Close();
}

アプリケーションを実行し、設定フォームに移動して[キャンセル]ボタンをクリックし、[はい]ボタンをクリックすると、WindowSettingsを閉じずにDialogSettingsCancelのみが閉じます。

なぜ機能しないのですか?

私も変えてみました

this.Close();
settings.Close();

settings.Close();
this.Close();

しかし、まだ同じ結果です。

10
osvein

新しいものではなく、開いているWindowSettingsの実際のインスタンスが必要です。

現在、WindowSettingsの新しいインスタンスを作成し、その上でCloseを呼び出しています。その新しいインスタンスが表示されたことがないため、それは何もしません。

代わりに、DialogSettingsCancelを表示するときに、WindowSettingsの現在のインスタンスを親として設定します。

このようなもの:

WindowSettingsで:

private void showDialogSettings_Click(object sender, EventArgs e)
{
    var dialogSettingsCancel = new DialogSettingsCancel();
    dialogSettingsCancel.OwningWindowSettings = this;
    dialogSettingsCancel.Show();
}

DialogSettingsCancelで:

public WindowSettings OwningWindowSettings { get; set; }

private void button1_Click(object sender, EventArgs e)
{
    this.Close();
    if(OwningWindowSettings != null)
        OwningWindowSettings.Close();
}

このアプローチでは、DialogSettingsCancelを親として使用せずにWindowsSettingsを開くことができる可能性があることを考慮しています。

2つが常に接続されている場合は、代わりにコンストラクターパラメーターを使用する必要があります。

WindowSettingsで:

private void showDialogSettings_Click(object sender, EventArgs e)
{
    var dialogSettingsCancel = new DialogSettingsCancel(this);
    dialogSettingsCancel.Show();
}

DialogSettingsCancelで:

WindowSettings _owningWindowSettings;

public DialogSettingsCancel(WindowSettings owningWindowSettings)
{
    if(owningWindowSettings == null)
        throw new ArgumentNullException("owningWindowSettings");

    _owningWindowSettings = owningWindowSettings;
}

private void button1_Click(object sender, EventArgs e)
{
    this.Close();
    _owningWindowSettings.Close();
}
10
Daniel Hilgarth
new WindowSettings();

そもそも表示されていないフォームの新しいインスタンスを閉じただけです。

フォームのインスタンスを、コンストラクターパラメーターとして受け入れてフィールドに保存することで閉じる必要があります。

6
SLaks

DialogResultメソッドを使用してフォームを閉じてみませんか?

if(DialogSettingsCancel.ShowDialog() == DialogResult.Yes)
{
     this.close();
}

ただし、これが機能するためには、DialogSettingsCancelフォームを呼び出すときに「WindowSettings」フォーム内でそれを行う必要があります。 OpenFileDialogまたは他のDialogフォームを呼び出すのとほぼ同じ方法。

3
jforward5

設定ウィンドウのインスタンスを作成した直後に閉じます。最初に設定ウィンドウを表示してから、ダイアログの結果を待つ必要があります。キャンセルされて戻ってきたら、ウィンドウを閉じます。例えば:

private void button1_Click(object sender, EventArgs e)
{
    Settings newSettingsWindow = new Settings();

    if (newSettingsWindow.ShowDialog() == DialogResult.Cancel)
    {
        newSettingsWindow.Close();
    }
}
2
Logan G.

アプリケーションを閉じることもできます:

Application.Exit();

プロセスを終了します。

1
user4227915

Winformを開くまたは閉じるには、さまざまな方法があります。 Form.Close()は、winformを閉じる方法の1つです。

'Form.Close()'を実行すると、そのフォームで作成されたすべてのリソースが破棄されます。リソースとは、コントロールとそのすべての子コントロール(ラベル、ボタン)、フォームなどを意味します。

Winformを閉じる他の方法

  1. Form.Hide()
  2. Application.Exit()

フォームを開く/開始するいくつかの方法

  1. Form.Show()
  2. Form.ShowDialog()
  3. Form.TopMost()

それらはすべて異なる動作をします、探検してください!

0

DialogSettingsCancelのコンストラクターのパラメーターとしてWindowSettingsを送信し、次にbutton1_Clickでyesが押されたときに両方のcloseメソッドを呼び出します。

public class DialogSettingsCancel
{
    WindowSettings parent;

    public DialogSettingsCancel(WindowSettings settings)
    {
        this.parent = settings;        
    }

    private void button1_Click(object sender, EventArgs e)
    {
        //Code to trigger when the "Yes"-button is pressed.
        this.parent.Close();
        this.Close();
    }
}

たとえば、アクションが実行されたときにWindowsフォームを閉じたい場合は、2つの方法があります

1.直接閉じるには

Form1 f=new Form1();
f.close(); //u can use below comment also
//this.close();

2.フォームを閉じることなく非表示にすることもできます

 private void button1_Click(object sender, EventArgs e)
    {
        Form1 f1 = new Form1();
        Form2 f2 = new Form2();
        int flag = 0;
        string u, p;
        u = textBox1.Text;
        p = textBox2.Text;
        if(u=="username" && p=="pasword")
        {
            flag = 1;
        }
        else
        {
          MessageBox.Show("enter correct details");
        }
        if(flag==1)
        {
            f2.Show();
            this.Hide();
        }

    }
0