Кнопки управления пользователя для закрытия диалогового окна

Я создал пользовательский элемент управления в своем приложении, в котором есть текстовое поле, а затем две кнопки. Одна кнопка предназначена для добавления данных в БД из текстового поля, а вторая отменяет действие. Затем этот пользовательский элемент управления добавляется в несколько диалоговых окон (форм), но я хочу, чтобы кнопки вызывали одни и те же события, по этой причине я разместил кнопки в пользовательском элементе управления, а не в диалоговом окне.

То, что я пытаюсь сделать, это после того, как они нажмут кнопку «Добавить данные» и это будет успешно, я хочу, чтобы он закрыл диалоговое окно, в котором находится элемент управления.

РЕДАКТИРОВАТЬ:

Я не знаю, как закодировать это, чтобы закрыть диалоговое окно, когда оно запускается из пользовательского элемента управления. Я не знаю, с чего начать, потому что раньше не использовал пользовательские элементы управления. Обычно у меня есть элементы управления в диалоговом окне, которые позволяют использовать DialogResult = DialogResult.OK;

Спасибо


person Taryn    schedule 16.03.2011    source источник
comment
Мое предложение состояло бы в том, чтобы показать нам некоторый код и точно указать, что вы подразумеваете под этим, не работает. Отсюда трудно сказать, что это значит.   -  person David Heffernan    schedule 16.03.2011
comment
Вы правы, это моя вина, что я не ясно выразился.   -  person Taryn    schedule 16.03.2011
comment
Ваше редактирование не помогает. Вы все еще не констатируете проблему.   -  person David Heffernan    schedule 16.03.2011
comment
Извините, если редактирование не поможет, я не знаю, как четко объяснить свою проблему, я думаю.   -  person Taryn    schedule 16.03.2011
comment
Что вы должны сделать, так это рассказать нам больше о том, что не работает. Есть ли ошибка. Форма просто не закрывается. Если это последнее, то я думаю, что у меня есть ответ.   -  person David Heffernan    schedule 16.03.2011


Ответы (6)


Формы, открытые модально, автоматически закрываются, когда установлен их DialogResult. Судя по всему, вы устанавливаете DialogResult элемента управления, а не форму. Чтобы сделать то, что вы пытаетесь сделать, вам нужен элемент управления, чтобы установить или вызвать настройку результата диалога родительских форм. Вы можете сделать это либо:

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

2. Создайте событие в элементе управления, которое слушает форма, которое сообщает ему закрыть. (рекомендуемый способ)

3. (Хакерский способ) Установите результат диалога формы, используя этот код:

this.ParentForm.DialogResult = DialogResult.OK;

Форма также должна быть показана модально, иначе вам нужно будет вызвать метод Close() вручную.

person Iain Ward    schedule 16.03.2011
comment
Провели небольшое исследование по диалоговому результату закрытия модального диалога, согласно документации, мы ошибаемся в закрытой части. - person Tony Abrams; 16.03.2011
comment
Настройка события может быть немного сложнее, но я также рекомендую делать это таким образом. В конечном счете, за самозакрытие должна отвечать форма, а не ограничивающий элемент управления. Таким образом, событие уведомляет о том, что в пользовательском элементе управления была нажата кнопка, а затем форма решает, как реагировать на это событие (в данном случае закрывая себя). - person Meta-Knight; 16.03.2011

Вы захотите использовать делегатов для решения этой проблемы.

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

public delegate void CloseHostFormEventHandler(Object sender, EventArgs e);

public partial class MyControl : Control {

    public event CloseHostFormEventHandler CloseFormEvent;


    public closeButton_Clicked(object sender, EventArgs) {
        // do your db stuff

        // you could create your own class here and pass the object to your main form if you wanted
        EventArgs myargs = new EventArgs(); 

        // tell host form to close itself
        CloseFormEvent(this, myargs);

    }
}

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

public partial class MyForm : Form {

    public MyForm() {

        InitializeComponent();

        // ill assume your control was added via the designer and thus done in InitializeComponent()

        // hook up event handler
        mycontrol.CloseFormEvent += CloseFormEventHandler(closeformCallback);
    }

    protected void closeformCallback(object sender, EventArgs e) {
        DialogResult = DialogResult.OK;
        this.Close();
    }


}
person tsiorn    schedule 16.03.2011
comment
Спасибо за предоставленный код. Принятый ответ правильный, но этот говорит вам, как это сделать. - person bornfromanegg; 21.09.2017

Я собираюсь сделать дикое предположение, так как вы не дали много информации.

Диалог не закрывается, потому что это не модальный диалог. Попробуйте показать это с помощью ShowDialog(), а не Show().

person David Heffernan    schedule 16.03.2011

Как говорит Тони. Вам нужно будет вызвать метод close.

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

person Nick    schedule 16.03.2011

Вы можете поместить обработчик события Click в свой пользовательский элемент управления примерно так:

        Form f = this.ParentForm;
        if (f != null)
        {
            f.DialogResult = DialogResult.OK;
        }
person cdel    schedule 16.03.2011

DialogResult не закрывает немодальную форму.

Вам нужно вызвать метод Close формы или, в данном случае, диалога.

ИЗМЕНИТЬ

Или используйте ShowDialog() вместо Show().

РЕДАКТИРОВАТЬ ПОВТОРНО

Согласно документации DialogResult:

Когда форма отображается в виде модального диалогового окна, нажатие кнопки «Закрыть» (кнопка со знаком X в правом верхнем углу формы) приводит к скрытию формы, а свойству DialogResult присваивается значение DialogResult.Cancel. Метод Close не вызывается автоматически, когда пользователь нажимает кнопку закрытия диалогового окна или устанавливает значение свойства DialogResult. Вместо этого форма скрыта и может быть снова показана без создания нового экземпляра диалогового окна. Из-за этого поведения вы должны вызывать метод Dispose формы, когда форма больше не нужна вашему приложению.

person Tony Abrams    schedule 16.03.2011
comment
Это происходит, если форма была открыта модально - person Iain Ward; 16.03.2011
comment
РЖУ НЕ МОГУ. Не могу поверить, что я забыл это в своем ответе. :П - person Tony Abrams; 16.03.2011
comment
Провел небольшое исследование по этому поводу, согласно документации, мы ошибаемся в близкой части. - person Tony Abrams; 16.03.2011