C#以另一种形式处理对话框的按钮单击

问题描述

| 我有一个表格。在这种情况下,我必须显示一个带有文本和“取消”按钮的对话框(在某些情况下)。我想在表单中捕获该按钮的事件,或者知道是否单击了取消按钮。 如何才能做到这一点 ?我相信这应该是可能的,但无法弄清楚怎么办? 从我的mainForm中,我有BackgroundWorker。启动backgroundWorker后,我打开一个childForm(带有Label和一个按钮),而当后台任务结束时,我关闭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 \的技术,它起作用了。我只需要添加标志来确定是否确实按下了取消按钮或正常关闭了window。 感谢大家的Tryig帮助我。非常感谢您的帮助。 谢谢     

解决方法

        将其放在应该捕获事件的形式中:
frmDialog.ShowDialog();
而这在对话框的btnCancel_Click事件中:
return DialogResult.Cancel();
抱歉,如果我在这里混淆了VB和C#,但是几乎一样。     ,        将
DialogResult
属性设置为
DialogResult.Ok
DialogResult.Cancel
然后以父级形式:
Form form = new Form();
DialogResult results = form.DialogResult;

if(results == DialogResult.Ok)
{

... make magic

}
else
{
...
}
    ,        您只需为显示对话框的表单创建一个事件 并以父级形式处理此事件 如果用户单击带有特定参数的确定火灾事件并取消另一个参数(例如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();
    }
}
    ,        您应该在需要显示为对话框的表单上使用
ShowDialog
方法,然后使用
DialogResult
属性将对话框操作的结果传达给父表单。 这样,您可以在拥有按钮的表单上单击按钮,但是将
DialogResult
设置为
DialogResult.Cancel
以指定用户按下了取消按钮。     ,        对话框通常是一个阻塞事件,父窗体进行的事件处理根本没有意义。 如果不是模式对话框,则始终可以在弹出表单中创建一个或多个公共事件,这些事件在单击按钮时触发。这些事件然后可以由父窗体捕获。 不要将您的按钮暴露给父窗体,这会很糟糕。     ,        使用以下内容:
Form form = new Form();
switch (form.ShowDialog())
{
    case DialogResult.Ok:
    {
        ....
        Break;
    }
    case DialogResult.Cancel:
    {
        ....
        Break;
    }
}
Form.AcceptButton
Form.CancelButton
属性设置为适当的按钮。 请参阅以下内容: Form.ShowDialog方法 DialogResult枚举 Form.AcceptButton属性 Form.CancelButton属性