|
为了让用户与应用程序交互,用户必须能看到窗体。利用Show和ShowDialog方法就可以实现这一点。Show方法仅使窗体对用户可见。这是很简单的。但它的一个缺点是没有给调用代码发送任何通知,说明调用的窗体已处理完,并退出。有时这不重要,Show方法工作的很好。如果需要提供某种通知,使用ShowDialog方法是一种比较好的选择。
在调用Show方法后,Show方法后面的代码会立即执行。在调用ShowDialog方法后,调用代码被暂停执行,等到调用ShowDialog方法的窗体关闭后再继续执行。不仅调用代码被暂停执行,而且窗体也可以返回一个DialogResult值。DialogResult枚举是一组标识符,它们描述了对话框关闭的原因,包括OK,Cancel,Yes,No和其他几个标识符。为了让窗体返回一个DialogResult值,必须设置窗体的DialogResult属性,或者在窗体的一个按钮上设置DialogResult属性。
例如,假定应用程序的一部分要求提供客户的电话号码。窗体包含一个输入电话号码的文本框,和两个按钮OK和Cancel。如果把OK按钮的DialogResult属性设置为DialogResult.OK,把Cancel按钮的DialogResult属性设置为DialogResult.Cancel,则在选择其中一个按钮时,窗体就会不可见,并给调用它的窗体返回相应的DialogResult值。现在注意窗体没有释放,只是把Visible属性设置为false。这是因为仍必须从窗体中获取值。在这个示例中,我们需要电话号码。在窗体上为电话号码创建一个属性,这样父窗体就可以获取值,并调用窗体上的Close方法了。下面是子窗体的代码:
[code=csharp]namespace ChildForm
{
public partial class Phone : Form
{
public Phone()
{
InitializeComponent();
btnOK.DialogResult = DialogResult.OK;
btnCancel.DialogResult = DialogResult.Cancel;
}
public string PhoneNumber
{
get
{
return txtPhone.Text;
}
set
{
txtPhone.Text = value;
}
}
}
}[/code]
首先要注意,不包含处理按钮的单击事件的代码。因为设置了每个按钮的DialogResult属性,所以在单击OK和Cancel按钮后,窗体就消失了。添加的唯一属性时PhoneNumber。下面的代码显示了父窗体中调用Phone对话框的方法:
[code=csharp]Phone frm = new Phone();
frm.ShowDialog();
if (frm.DialogResult == DialogResult.OK)
{
label1.Text = "Phone number is " + frm.PhoneNumber;
}
else if (frm.DialogResult == DialogResult.Cancel)
{
label1.Text = "Form was canceled.";
}
frm.Close();[/code]
这看起来非常简单。创建新的Phone对象frm,在调用frm.ShowDialog()方法时,这个方法中的代码会停止执行,等待Phone窗体返回。接着检查Phone窗体的DialogResult属性。由于窗体还未释放,是不可见的,所以仍可以访问公共属性,其中一个公共属性就是PhoneNumber.一旦获取了需要的数据,就可以调用窗体的Close方法。
一切正常,但如果返回的电话号码格式不正确,该怎么办?如果把ShowDialog放在循环中,就可以再次调用它,让用户重新输入值。这样就可以得到正确的值,注意,如果用户单击了Cancel按钮,还必须处理DialogResult.Cancel:
[code=csharp]Phone frm1 = new Phone();
while (true)
{
frm1.ShowDialog();
if (frm1.DialogResult == DialogResult.OK)
{
label1.Text = "Phone number is " + frm1.PhoneNumber;
if (frm1.PhoneNumber.Length == 8 || frm1.PhoneNumber.Length == 12)
{
break;
}
else
MessageBox.Show("Phone number was not formatted correctly.\n Please correct entry.");
}
}
else if (frm1.DialogResult == DialogResult.Cancel)
{
label1.Text = "Form was canceld.";
break;
}
}
frm1.Close();[/code]
如果电话号码的长度没有通过简单的测试,Phone窗体就会显示出来,让用户更正错误。ShowDialog框没有创建窗体的新实例,在窗体上输入的文本仍在该窗体上,所以如果必须重新设置窗体,就需要程序员自己完成。 |
|