C#处理对话框';s按钮在另一个窗体中单击

本文关键字:另一个 窗体 单击 按钮 对话框 处理 | 更新日期: 2023-09-27 17:57:59

我有一个表单。在这个表单中,我可以显示一个带有Text和Cancel按钮的对话框(在某些情况下)。我想在表单中捕捉该按钮的事件,或者知道是否单击了取消按钮。

如何做到这一点?我相信这应该是可能的,但不知道怎么做?

在我的主窗体中,我有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;
    }

在主窗体中:

    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正常关闭。

感谢你们所有人帮助我。我真的很感激你的帮助。

感谢

C#处理对话框';s按钮在另一个窗体中单击

DialogResult属性设置为DialogResult.OkDialogResult.Cancel

然后以父形式:

Form form = new Form();
DialogResult results = form.DialogResult;
if(results == DialogResult.Ok)
{
... make magic
}
else
{
...
}

将其放入应该捕获事件的表单中:

frmDialog.ShowDialog();

在对话框的btnCancel_Click事件中:

return DialogResult.Cancel();

如果我在这里混淆了VB和C#,很抱歉,但它几乎是一样的。

只需为显示对话框的窗体创建一个事件并以父窗体处理此事件如果用户点击具有特定参数的ok fire事件,并取消另一个参数(如dialogsult.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以指定用户按下了取消按钮。

对话框通常是一个阻塞事件,其中由父窗体进行的事件处理根本没有意义。

如果它不是一个模式对话框,您总是可以在弹出窗体中创建一个或多个公共事件,这些事件在单击按钮时触发。这些事件可以被父窗体捕获。

不要将按钮暴露在父窗体中,这将是糟糕的oo编程。

使用以下内容:

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

Form.AcceptButtonForm.CancelButton属性设置为相应的按钮。


参考以下内容:

Form.ShowDialog方法

DialogResult枚举

Form.AcceptButton属性

Form.CancelButton属性