Welcome

首页 / 软件开发 / .NET编程技术 / WinForm控件开发总结(九) 为属性提下拉式属性编辑器

WinForm控件开发总结(九) 为属性提下拉式属性编辑器2011-11-14 博客园 纶巾客在上一篇文章,我介绍了如何编写模态对话框属性编辑器,这篇文章我将介绍如何编写下拉式属性编 辑器。下拉式(DropDown)属性编辑器和模态对话框属性编辑器的不同之处就是,当你点击属性值修改的 时候,模态对话框编辑器是弹出一个模态对话框,而下拉式属性编辑器却是在紧贴着属性值的地方显示一 个下拉的控件。不知道大家注意到了没有,这里我说的是显示一个下拉的控件,而这个控件也是需要你去 开发的,接下来我还是以Scope属性为例,介绍一下具体的实现。

首先我们要创建一个用于编辑属性的控件,在本系列文章的开始,我们介绍了自定义控件有三种类型 :复合控件,扩展控件,自定义控件。在本例中我们制作一个复合控件(Compsite control),复合控件 的开发比较简单,不在本系列文章的讲解范围,我简单做个介绍,在Solution 浏览器里右键点击 CustomControlSample工程选择Add->User Control…,输入文件名ScopeEditorControl.cs。我们做的 这个复合控件上一篇文章介绍的模态对话框所包含子控件基本一样,除了用于确认和取消的按钮,如下图 :

由于我们取消了用于确认和取消的按钮,并且是一个下拉的编辑器控件,在出现下面三种情况的时候 下拉的编辑器控件会关闭:用户敲了回车,用户敲了ESC键,用户点击了编辑器以外的地方。当下拉编辑 器控件关闭的时候我们就需要更新属性的值。下边是这个控件的代码:

using System;using System.Collections.Generic;using System.ComponentModel;using System.Drawing;using System.Data;using System.Text;using System.Windows.Forms;namespace CustomControlSample{    public partial class ScopeEditorControl : UserControl    {        private Scope _oldScope;        private Scope _newScope;        private Boolean canceling;                public ScopeEditorControl(Scope scope)        {            _oldScope = scope;            _newScope = scope;            InitializeComponent();        }        public Scope Scope        {            get            {                return _newScope;            }        }        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);            }        }        protected override bool ProcessDialogKey(Keys keyData)        {            if (keyData == Keys.Escape)            {                _oldScope = _newScope;                canceling = true;            }            return base.ProcessDialogKey(keyData);        }        private void ScopeEditorControl_Leave(object sender, EventArgs e)        {            if (!canceling)            {                _newScope.Max = Convert.ToInt32(textBox1.Text);                _newScope.Min = Convert.ToInt32(textBox2.Text);            }        }        private void ScopeEditorControl_Load(object sender, EventArgs e)        {            textBox1.Text = _oldScope.Max.ToString();            textBox2.Text = _oldScope.Min.ToString();        }    }}