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

时间:2011-05-31 15:06:55

标签: c# winforms button dialog click

我有一张表格。在那里,我必须使用Text和Cancel按钮显示一个对话框(在某些情况下)。我想在我的表单中捕获该按钮的事件或者知道是否单击了取消按钮。

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

从我的mainForm我有BackgroundWorker。当backgroundWorker启动时,我打开一个childForm(带有Label和一个按钮),当后台任务结束时,我关闭了childForm。我想要的更多是:当点击childForm的按钮时,应该取消后台工作的正在进行的任务。 的

在我的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 个答案:

答案 0 :(得分:2)

DialogResult属性设置为DialogResult.OkDialogResult.Cancel

然后在父母表格中:

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

if(results == DialogResult.Ok)
{

... make magic

}
else
{
...
}

答案 1 :(得分:1)

将它放在应该捕获事件的表单中:

frmDialog.ShowDialog();

这是在对话框的btnCancel_Click事件中:

return DialogResult.Cancel();

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

答案 2 :(得分:1)

只需为显示对话框的表单创建一个事件即可 并以父表单处理此事件 如果用户点击带有specefic参数的ok fire事件并取消另一个参数(例如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();
    }
}

答案 3 :(得分:0)

您应该在需要显示为对话框的表单上使用ShowDialog方法,然后使用DialogResult属性与父窗体进行对话操作的结果通信。

这样您就可以处理拥有该按钮的表单上的按钮,但将DialogResult设置为DialogResult.Cancel以指定用户按下取消按钮。

答案 4 :(得分:0)

使用以下内容:

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

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


请参阅以下内容:

Form.ShowDialog Method

DialogResult Enumeration

Form.AcceptButton Property

Form.CancelButton Property

答案 5 :(得分:0)

对话框通常是一个阻塞事件,其中父表单的事件处理完全没有意义。

如果它不是模态对话框,您始终可以在弹出窗体中创建一个或多个公共事件,这些事件在单击按钮时触发。然后可以通过父表单捕获这些事件。

不要将您的按钮暴露给父表单,这将是糟糕的oo编程。