WinForm控件开发基础教程八弹出式编辑对话框
更新时间:2024-06-04 12:30:01 阅读量: 综合文库 文档下载
WinForm控件开发基础教程八弹出式编辑对话框
前几篇文章我们一直在讨论如何更方便的编辑复杂类型的属性,在这个过程中我介绍了类型转换器以及如何制作自己的类型转换器来实现属性值的串行化和实现子属性的编辑。对于Scope这种级别的复杂属性,一个类型转换器就已经足够了,但是对于更为复杂的属性,单单使用类型转换器已经不足以应付了,比如我们常用的Font属性。
在这种情况下,我们就需要提供更为复杂的编辑方式,比如属性编辑对话框,你还记得Font对话框吗?现在我们就来看看如何实现更复杂的属性编辑。复杂的属性编辑器分为两种类型,一种是弹出式模态对话框属性编辑器,一种式下拉式属性编辑器。如果你还没有感性的认识的话,可以观察一下TextBox控件的属性,Font属性的编辑器是模态对话框属性编辑器,Dock属性的编辑器是下拉式属性编辑器。
接下来我们来制作一个模态对话框编辑器,虽然Scope属性并不复杂,但是为了演示的方便,我们还是用它来做例子。
首先我们要做一个用来编辑属性的对话框,在对话框的构造函数里传入要编辑的属性的值。在对话框类里,声明一个Scope类型的私有变量_scope用以保存传入和编辑后的值。还要增加一个Scope属性,以便外部环境能够获取编辑后的结果。对话框的外观如下:
在这个对话框里,我们要把OK按钮的DialogResult属性设为OK(当点击OK按钮时,模态对话框关闭,并返回DialogResult.OK),将Cancel按钮的DialogResult属性设为Cancel(当点击OK按钮时,模态对话框关闭,并返回DialogResult.OK)。另外我们要对用户输入的值做验证,以保证Scope的min和max值都是Int32类型。下边是对话框的代码:
using System;
using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text;
using System.Windows.Forms;
namespace CustomControlSample {
public partial class ScopeEditorDialog : Form {
private Scope _scope = null;
public ScopeEditorDialog(Scope scope) {
InitializeComponent(); _scope = scope;
textBox1.Text = _scope.Min.ToString(); textBox2.Text = _scope.Max.ToString(); }
private void button1_Click(object sender, EventArgs e) {
_scope.Min = Convert.ToInt32(textBox1.Text); _scope.Max = Convert.ToInt32(textBox2.Text); }
private void textBox1_Validating(object sender, CancelEventArgs e) {
try {
Int32.Parse(textBox1.Text); }
catch (FormatException) {
e.Cancel = true;
MessageBox.Show(\无效的值\\验证错误\MessageBoxButtons.OK, MessageBoxIcon.Error); } }
private void textBox2_Validating(object sender, CancelEventArgs e) {
try {
Int32.Parse(textBox2.Text); }
catch (FormatException) {
e.Cancel = true;
MessageBox.Show(\无效的值\\验证错误\MessageBoxButtons.OK, MessageBoxIcon.Error); } }
public Scope Scope {
get { return _scope; } set { _scope = value; } } } }
每一个属性的编辑器都是直接或者间接的派生于UITypeEditor。开发环境从来也不会直接调用我们编写的模态对话框来编辑属性,而是调用UITypeEditor的某些虚方法,所以我们还必须提供一个派生于UITypeEditor的类来与开发环境通信。下边的代码实现了Scope的编辑器:
using System;
using System.ComponentModel; using System.Drawing.Design;
using System.Windows.Forms.Design; using System.Windows.Forms;
namespace CustomControlSample {
public class ScopeEditor : UITypeEditor {
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context) {
if (context != null && context.Instance != null) {
return UITypeEditorEditStyle.Modal; }
return base.GetEditStyle(context); }
public override object EditValue(ITypeDescriptorContext context, IServiceProvider provider, object value) {
IWindowsFormsEditorService editorService = null;
if (context != null && context.Instance != null && provider != null) {
editorService =
(IWindowsFormsEditorService) provider.GetService(typeof(IWindowsFormsEditorService)); if (editorService != null) {
MyListControl control = (MyListControl) context.Instance;
ScopeEditorDialog dlg = new ScopeEditorDialog(control.Scope); if (dlg.ShowDialog() == DialogResult.OK)
{
value = dlg.Scope; return value; } } }
return value; } } }
在这个类里,我们重写了两个方法,一个是GetEditStyle,在这个方法里,我们通知开发环境,属性的编辑器是一个模态对话框。另一个方法是EditValue,这是最核心的方法,在这个方法里,我们通过上下文环境获得了正在编辑的控件的实例,并将实例的Scope属性传递给属性编辑对话框,显示对话框供用户编辑属性的值,用户编辑完属性的值,并关闭对话框,这时,我们从对话框里获取编辑后的结果反会给开发环境。编写完Editor,我们就要将它应用到MyListControl的Scope属性上,现在的Scope属性定义如下: [Browsable(true)]
[Editor(typeof(ScopeEditor), typeof(UITypeEditor))] public Scope Scope {
get { return _scope; } set { _scope = value; } }
我们在Scope属性前加上了[Editor(typeof(ScopeEditor),typeof(UITypeEditor))]元数据。Build工程,查看实际的效果。在测试工程的窗体上,选中控件,观察Scope属性,当我们单击Scope属性的值时,在属性值的后边出现了一个按钮,如图:
当我们点击这个按钮后,弹出了属性编辑的对话框,如图:
我们在对话框里编辑属性的值,并点击OK关闭对话框,现在Scope属性值已经被修改了。
正在阅读:
部编人教版一年级语文上册:13.乌鸦喝水09-24
浅析傣族打击乐器与舞蹈活动06-03
村务监督委员会工作计划3篇03-26
关于中级财务会计2015.12.2212-26
国际经济学5章课件笔记12-21
2022银行违规案例学习心得感悟范文三篇04-03
四川省达州市宣汉县排水工程设计开题报告最终版(给水排水工程毕06-05
消音器安装施工方案01-13
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 弹出式
- 控件
- 对话框
- 编辑
- WinForm
- 基础
- 教程
- 开发
- 沙坝镇中心校学生营养餐工作实名制管理岗位责任制
- 贵州省遵义四中08~09学年第一学期半期考试试卷
- 上机实验五- 循环结构程序设计 - 答案
- 实用文写作网上作业
- 文都网校2017考研基础词汇-刘一男(原版 下)
- 荆州中生组织设计
- 地下车库钢筋工程专项施工方案1
- 上海市2018年中考地理试题word版含解析
- 苏教版小学数学一年级分与合集体备课 王峰(2)
- 新目标英语八年级下重点短语及句型总汇
- 第二章 进程管理习题和答案
- 多思善想学习选取立论的角度
- 山东博士解剖真题
- 《投资项目评估》参考题
- 山西省教育厅关于安排2011年教师资格理论考试通知
- 高一经济学复习提纲
- 《量子力学》题库
- 2018年秋华师大版九年级上《第22章一元二次方程》检测题含答案
- lanju ERP EUM-SD-160 退货流程操作手册
- 2017 - 2018学年高二数学下学期5月月考试题(2)