开发者

C# Handle a dialog's button click in another form

开发者 https://www.devze.com 2023-03-09 23:29 出处:网络
I have a form. In that I got to show a dialog (on some circumstances) with Text and a Cancel button. I want to catch the event of that button in m开发者_StackOverflowy form Or know if that cancel butt

I have a form. In that I got to show a dialog (on some circumstances) with Text and a Cancel button. I want to catch the event of that button in m开发者_StackOverflowy form Or know if that cancel button was clicked.

How can this be done ? I believe this should be possible but can't make out how ?

From my mainForm I have BackgroundWorker. When the backgroundWorker is started I open a childForm (with a Label and a button) and when the background task is over, I close the childForm. What I want more is : when the button of childForm is clicked the ongoing task of backgroundWorker should be cancelled. SOLUTION

In my childForm I have set CancelButton property as cancelBtn for the form. The othe code is :

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

In 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 
                     }   
                }
            }  

I had tried using @DeveloperX technique i.e. EventHandler in parent class, but the parent class method was nver being called. Tried a lot but couldn't success. Then tried of @RobinJ's technique and it worked. I just had to add flag to identify was really cancel button pressed or jjst windw was closed normally.

Thanks to all of you for tryig to help me out. I really appreciate your help.

Thanks


Set DialogResult property to either DialogResult.Ok or DialogResult.Cancel

Then in the parent form:

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

if(results == DialogResult.Ok)
{

... make magic

}
else
{
...
}


Put this in the form that should catch the event:

frmDialog.ShowDialog();

And this in the btnCancel_Click event of the dialog:

return DialogResult.Cancel();

Sorry if I'm confusing VB and C# here, but it's pretty much the same.


Simply you can create an event for the form that shows the dialog and handle this event in parent form in case the user clicks on ok fire event with specefic parameter and for cancel another parameter (such dialogresult.cancel)

an pseudo implementation can be like this

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


You should be using the ShowDialog method on the form you need to show as a dialog and then use the DialogResult property to communicate to the parent form the result of the dialog operation.

This way you handle the button click on the form that owns the button but set the DialogResult to DialogResult.Cancel to specify that the user pressed the cancel button.


A dialog is usually a blocking event, where eventhandling by the parent form would make no sense at all.

If it isn't a modal dialog, you can always create one or several public events in the popup form, that are triggered when the buttons are clicked. These events can then be caught by the parent form.

Don't expose your buttons to the parent form, it would be terrible oo-programming.


Use the following:

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

Set the Form.AcceptButton and Form.CancelButton properties to the appropriate buttons.


Refer to the following:

Form.ShowDialog Method

DialogResult Enumeration

Form.AcceptButton Property

Form.CancelButton Property

0

精彩评论

暂无评论...
验证码 换一张
取 消