问题描述
|
我有一个表格。在这种情况下,我必须显示一个带有文本和“取消”按钮的对话框(在某些情况下)。我想在表单中捕获该按钮的事件,或者知道是否单击了取消按钮。
如何才能做到这一点 ?我相信这应该是可能的,但无法弄清楚怎么办?
从我的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属性