很多时候我们会希望弹出一个模式窗口,让用户选择一个文件、输入一个值、设置一下筛选条件等等,然后按确定键继续执行后续的操作,或者按取消按钮中断后续的操作。这是一种非常典型的模式窗口应用场景,下面我们就来做一个这样窗体。
第一步:先创建一个普通的自定义窗体。然后按照上面布局放一个标签,修改文本为“请选择要吃的食物”,放三个SmRadioButton,修改他们的控件名称和显示文本,再放两个SmButton按钮,修改他们的名称和显示文本。
第二步:设置确定按钮的对话框结果(DialogResult)属性为OK。这个属性是为了告知按钮在用户单击按钮之后给当前窗体返回确认的结果。然后执行完单击命令后顺便关闭当前窗口。
第三步:设置取消按钮的对话框结果(DialogResult)属性为Cancel。这个属性是为了告知按钮在用户单击按钮之后给当前窗体返回取消的结果。然后执行完单击命令后顺便关闭当前窗口。
第四步:设置窗体的确定按钮(AcceptButton)和取消按钮(CancelButton)属性为相应的按钮。“确定按钮”这个属性是为了让我们在不用鼠标点击命令按钮的情况下,直接按回车键可以模拟单击按钮。“取消按钮”这个属性是为了让我们在不用鼠标点击按钮的情况下,直接按Esc键可以模拟单击相应按钮的效果。
第五步:在确定按钮里面写下相应的赋值代码。
Vb.Net |
Public Sub btnConfirm_Click(sender As Object,e As System.EventArgs) Dim rdoApple As SmRadioButton=Me.SmForm.ControlDictionary()("rdoApple") Dim rdoBanana As SmRadioButton=Me.SmForm.ControlDictionary()("rdoBanana") Dim rdoPea As SmRadioButton=Me.SmForm.ControlDictionary()("rdoPea") '如果哪个选项按钮选中,就将结果返回到SmForm.FormReturnValue.ReturnValue属性中,方便其他地方获取结果 If rdoApple.Checked Then Me.SmForm.FormReturnValue.ReturnValue="苹果" End If If rdoBanana.Checked Then Me.SmForm.FormReturnValue.ReturnValue="香蕉" End If If rdoPea.Checked Then Me.SmForm.FormReturnValue.ReturnValue="梨" End If End Sub |
C# |
public void btnConfirm_Click(object sender, System.EventArgs e) { SmRadioButton rdoApple = this.SmForm.ControlDictionary()["rdoApple"] as SmRadioButton; SmRadioButton rdoBanana = this.SmForm.ControlDictionary()["rdoBanana"] as SmRadioButton; SmRadioButton rdoPea = this.SmForm.ControlDictionary()["rdoPea"] as SmRadioButton; // 如果哪个选项按钮选中,就将结果返回到SmForm.FormReturnValue.ReturnValue属性中,方便其他地方获取结果 if (rdoApple.Checked) this.SmForm.FormReturnValue.ReturnValue = "苹果"; if (rdoBanana.Checked) this.SmForm.FormReturnValue.ReturnValue = "香蕉"; if (rdoPea.Checked) this.SmForm.FormReturnValue.ReturnValue = "梨"; } |
第六步:设置其中一个选项的选中(Checked)属性为True。这是为了让选择结果有一个默认值。
上面的窗体只要保存一下即可完成设计了。那么我们应该如何使用这样的模式窗口呢?下面就是实际使用时的代码示例:
Vb.Net |
'这里定义一个窗体变量用来存储要打开的窗体。原因有两个,一是窗体要使用多次, '二是SmForm.ShowDialog()确定完毕后会自动关闭窗口。关闭窗口后就无法通过Proj.Forms("典型模式窗口")来引用到相同的窗体了。 '因为我们要获得之前存在窗体SmForm.FormReturnValue.ReturnValue中的值,所以得直接从变量中读取 Dim frm As SmForm=Proj.Forms("典型模式窗口") If frm.ShowDialog()=DialogResult.OK Then '读取返回的数据得从窗体变量中读 MessageBox.Show("您要吃的食物是:" + frm.FormReturnValue.ReturnValue.ToString()) End If |
C# |
// 这里定义一个窗体变量用来存储要打开的窗体。原因有两个,一是窗体要使用多次, // 二是SmForm.ShowDialog()确定完毕后会自动关闭窗口。关闭窗口后就无法通过Proj.Forms("典型模式窗口")来引用到相同的窗体了。 // 因为我们要获得之前存在窗体SmForm.FormReturnValue.ReturnValue中的值,所以得直接从变量中读取 SmForm frm = Proj.Forms["典型模式窗口"]; if (frm.ShowDialog() == DialogResult.OK) // 读取返回的数据得从窗体变量中读 MessageBox.Show("您要吃的食物是:" + frm.FormReturnValue.ReturnValue.ToString()); |
最后执行的窗体效果如下:我们选择一个值,然后直接回车就弹出相应的结果。如果我们按ESC键就直接退出窗体。
后续
上面的示例看似已经很完整了,但是有时候我们还需要在“确定”按钮里面作一些检验,比如我们选择或输入的参数是否符合我们的要求,如果不符合我们的要求的话就弹出一个对话框提示一下用户哪里有问题,然后并不关闭窗体,等待用户作修改或取消操作。我们上面提到了,在确定按钮上设置了对话框结果(DialogResult)属性为OK,这个就会导致窗体自动关闭。如果我们想自己做数据验证的话,这个关闭动作就得我们自己控制。所以这里得改一改。
为了模拟一些异常,我们将上面第六步设置的默认选中状态给取消掉。然后再将确定按钮的对话框结果(DialogResult)属性为None。最后再修改一下确定按钮的单击事件代码。
Vb.Net |
|
C# |
public void btnConfirm_Click(object sender, System.EventArgs e) { SmRadioButton rdoApple = this.SmForm.ControlDictionary()["rdoApple"] as SmRadioButton; SmRadioButton rdoBanana = this.SmForm.ControlDictionary()["rdoBanana"] as SmRadioButton; SmRadioButton rdoPea = this.SmForm.ControlDictionary()["rdoPea"] as SmRadioButton; // 如果哪个选项按钮选中,就将结果返回到SmForm.FormReturnValue.ReturnValue属性中,方便其他地方获取结果 if (rdoApple.Checked) this.SmForm.FormReturnValue.ReturnValue = "苹果"; if (rdoBanana.Checked) this.SmForm.FormReturnValue.ReturnValue = "香蕉"; if (rdoPea.Checked) this.SmForm.FormReturnValue.ReturnValue = "梨"; // 如果没有返回结果,说明用户没有选择,需要提示用户 if (this.SmForm.FormReturnValue.ReturnValue==null || this.SmForm.FormReturnValue.ReturnValue.ToString().Length == 0) MessageBox.Show("请先选择好您要吃的食物后再点确定按钮!"); else { // 我们可以直接将结果赋值给窗体的DialogResult属性,赋值之后窗体也会自动关闭 this.SmForm.DialogResult = DialogResult.OK; } } |
重新执行一下上面的测试代码,我们就可以看到我们检验数据的提示信息,关闭提示信息也不会立即关闭窗口,等待我们修改设置。