Как закрыть форму в C#

Ok, поэтому класс Windows Forms, WindowSettings и форма имеют кнопку "Отмена". Когда пользователь нажмет кнопку, появится диалоговое окно DialogSettingsCancel и спросит пользователя, уверен ли он, что хочет выполнить действие. Диалог имеет 2 кнопки, кнопку"Да "и кнопку"Нет". Если пользователь нажимает кнопку "Да", я хочу, чтобы оба DialogSettingsCancel и WindowSettings были закрыты.

мой обработчик событий button_Click в DialogSettingsCancel:

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();
}

когда я запускаю свое приложение, и перейдите в форму настройки, и нажмите кнопку "Отмена"-кнопка, а затем нажмите кнопку "Да"-кнопка, только DialogSettingsCancel закрывается без закрытия WindowSettings.

почему это не работает?

Я также пытался изменить

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

to

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

но все тот же результат.

7 ответов


вам нужен фактический экземпляр WindowSettings это открыто, а не новое.

в настоящее время, вы создаете новый экземпляр WindowSettings, а вызов Close об этом. Это ничего не делает, потому что этот новый экземпляр никогда не был показан.

вместо этого, при показе DialogSettingsCancel установите текущий экземпляр WindowSettings как родитель.

что-то вроде этого:

на WindowSettings:

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

In DialogSettingsCancel:

public WindowSettings OwningWindowSettings { get; set; }

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

этот подход учитывает, что a DialogSettingsCancel потенциально может быть открыт без WindowsSettings как родитель.

если они всегда связаны, вы должны вместо этого использовать параметр конструктора:

на 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();
}

new WindowSettings();

вы только что закрыли совершенно новый экземпляр формы, который не был виден в первую очередь.

вам нужно закрыть оригинал экземпляр формы, принимая его в качестве параметра конструктора и хранить его в поле.


почему бы не использовать метод DialogResult для закрытия формы?

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

для этого вам нужно будет сделать это внутри формы "WindowSettings" при вызове формы DialogSettingsCancel. Точно так же вы могли бы вызвать OpenFileDialog или любую другую диалоговую форму.


закрытие экземпляра окна настроек сразу после его создания. Сначала вам нужно отобразить окно настроек, а затем дождаться результата диалога. Если он возвращается как отмененный, закройте окно. Например:

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

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

отправить WindowSettings в качестве параметра конструктора DialogSettingsCancel и затем на методе 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();
    }
}

вы также можете закрыть приложение:

Application.Exit();

это завершит процессы.


например, если вы хотите закрыть форму windows при выполнении действия, для этого существует два метода

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();
        }

    }