Кнопки управления пользователя для закрытия диалогового окна - PullRequest
3 голосов
/ 16 марта 2011

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

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

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

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

Спасибо

Ответы [ 6 ]

6 голосов
/ 16 марта 2011

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

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

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

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

this.ParentForm.DialogResult = DialogResult.OK;

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

4 голосов
/ 16 марта 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();
    }


}
2 голосов
/ 16 марта 2011

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

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

1 голос
/ 16 марта 2011

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

        Form f = this.ParentForm;
        if (f != null)
        {
            f.DialogResult = DialogResult.OK;
        }
1 голос
/ 16 марта 2011

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

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

0 голосов
/ 16 марта 2011

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

Вам необходимо вызвать метод Close формы или в этом случае диалоговое окно.

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

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

ИЗМЕНИТЬ СНОВА

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

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

...