C # Обрабатывать нажатие кнопки диалога в другой форме - PullRequest
2 голосов
/ 31 мая 2011

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

Как это можно сделать?Я считаю, что это возможно, но не могу понять, как?

Из моей основной формы у меня есть BackgroundWorker.Когда запускается backgroundWorker, я открываю childForm (с меткой и кнопкой), а когда фоновая задача заканчивается, я закрываю childForm.Что я хочу больше, так это то, что при нажатии кнопки childForm текущая задача backgroundWorker должна быть отменена. РЕШЕНИЕ

В моей childForm я установил свойство CancelButton как cancelBtn для формы.Другой код:

    private bool cancel;
    public bool Cancel
    {
        get { return cancel; }
        set { cancel = value; }
    }
    // Set the flag as true to indicate that Cancel button was actually pressed
    private void cancelBtn_Click(object sender, EventArgs e)
    {
        Cancel = true;
    }

В mainForm:

    childDlg = new ChildDialog();

    // wHILE cALLING
            backgroundWorker1.RunWorkerAsync();
            msg = "Connecting...";
            childDlg .set(msg, "");
            if (!childDlg .IsAccessible)
            {
                // This is caught even when the dialog is closed   
                if (childDlg .ShowDialog() == DialogResult.Cancel) {
                     if (childDlg.Cancel == true) { // Was really cancelBtn pressed  
                         // NOW ONLY do my stuff 
                     }   
                }
            }  

Я пытался использовать метод @DeveloperX, т.е. EventHandler в родительском классе, но метод родительского класса никогда не вызывался.Много пытался, но не смог добиться успеха.Затем попробовал технику @ RobinJ, и это сработало.Мне просто нужно было добавить флаг, чтобы определить, была ли нажата кнопка отмены, или jjst windw был нормально закрыт.

Спасибо всем вам за попытку помочь мне.Я действительно ценю твою помощь.

Спасибо

Ответы [ 6 ]

2 голосов
/ 31 мая 2011

Установите для свойства DialogResult значение DialogResult.Ok или DialogResult.Cancel

Затем в родительской форме:

Form form = new Form();
DialogResult results = form.DialogResult;

if(results == DialogResult.Ok)
{

... make magic

}
else
{
...
}
1 голос
/ 31 мая 2011

Просто вы можете создать событие для формы, которая показывает диалог, и обработать это событие в родительской форме в случае, если пользователь нажимает на событие ok fire с параметром specefic и для отмены другого параметра (такого как dialogresult.cancel)

псевдо реализация может быть такой

public class FormChild : System.Windows.Forms.Form
{
    public event EventHandler DialogCanceled;
    public event EventHandler DialogConfirmed;
    public void ShowDialog()
    {
        using (var dialogForm = new   FormDialog())
        {
            if (dialogForm.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                if (DialogConfirmed != null)
                    DialogConfirmed(this,new EventArgs());
            }
            else
            {
                if (DialogCanceled != null)
                    DialogCanceled(this,new EventArgs());
            }
        }
    }
}
public class ParentForm : System.Windows.Forms.Form
{
    public void callChild()
    {
        using (var f = new FormChild())
        {
            f.DialogCanceled += new EventHandler(f_DialogCanceled);
            f.DialogConfirmed += new EventHandler(f_DialogConfirmed);
            f.ShowDialog();
        }
    }

    void f_DialogConfirmed(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }

    void f_DialogCanceled(object sender, EventArgs e)
    {
        throw new NotImplementedException();
    }
}
1 голос
/ 31 мая 2011

Поместите это в форму, которая должна перехватить событие:

frmDialog.ShowDialog();

И это в событии btnCancel_Click диалога:

return DialogResult.Cancel();

Извините, если я путаю VB иC # здесь, но это почти то же самое.

0 голосов
/ 31 мая 2011

Диалог обычно является блокирующим событием, когда обработка события родительской формой вообще не имеет смысла.

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

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

0 голосов
/ 31 мая 2011

Используйте следующее:

Form form = new Form();
switch (form.ShowDialog())
{
    case DialogResult.Ok:
    {
        ....
        Break;
    }
    case DialogResult.Cancel:
    {
        ....
        Break;
    }
}

Установите свойства Form.AcceptButton и Form.CancelButton для соответствующих кнопок.


См. Следующее:

Метод Form.ShowDialog

Перечисление DialogResult

Form.AcceptButton Property

Form.CancelButton Property

0 голосов
/ 31 мая 2011

Вы должны использовать метод ShowDialog в форме, которую необходимо отобразить в виде диалога, а затем использовать свойство DialogResult, чтобы сообщить родительской форме результат операции диалога.

Таким образом, вы обрабатываете нажатие кнопки на форме, которой принадлежит кнопка, но устанавливаете DialogResult на DialogResult.Cancel, чтобы указать, что пользователь нажал кнопку отмены.

...