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(); } }}