WinForm控件开发总结(九)-----为属性提下拉式属性编辑器

简介:
  在上一篇文章,我介绍了如何编写模态对话框属性编辑器,这篇文章我将介绍如何编写下拉式属性编辑器。下拉式( 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();
        }



    }

}


         和模态对话框编辑器一样,开发环境并不会直接调用我们的编辑器控件,而是用过UITypeEditor类的派生来实现编辑器的调用,所以我们必须实现一个下拉式编辑器。代码如下:
      
using  System;
using  System.ComponentModel;
using  System.Drawing.Design;
using  System.Windows.Forms.Design;
using  System.Windows.Forms;

namespace  CustomControlSample
{
    
public class ScopeDropDownEditor : UITypeEditor
    
{
        
public override UITypeEditorEditStyle GetEditStyle(ITypeDescriptorContext context)
        
{
            
if (context != null && context.Instance != null)
            
{
                
return UITypeEditorEditStyle.DropDown;
            }


            
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;
                    ScopeEditorControl editorControl 
= new ScopeEditorControl(control.Scope);
                    editorService.DropDownControl(editorControl);
                    value 
= editorControl.Scope;
                    
return value;
                }

            }


            
return value;
        }


    }

}

      看过上一篇文章的朋友应该对这段代码很熟悉,是的,这两个编辑器的代码只有几行不同之处,在GetEditStyle方法中,我们返回的是UITypeEditorEditStyle.DropDown,而不是UITypeEditorEditStyle.Modal,表明我们的编辑器是一个下拉式的编辑器。在EditValue中的不同之处是,我们使用DropDownControl方法来显示编辑器。编辑器制作完毕,我们把Scope以前的编辑器替换成下拉式编辑器,如下:
      

[Browsable( true )]
        [Editor(
typeof (ScopeDropDownEditor),  typeof (UITypeEditor))]
        
public  Scope Scope
        
{
            
get
            
{
                
return _scope;
            }

            
set
            
{
                _scope 
= value;
            }

        }

       现在 build CustomControlSample 工程,然后切换到测试工程查看 Scope 属性。当我们点击属性的值,在属性值的后边出现了一个按钮:
         

   当点击这个按钮的时候,下拉的属性编辑器出现了:
      

   好了,属性的编辑到这里就讲完了。






本文转自纶巾客博客园博客,原文链接:http://www.cnblogs.com/guanjinke/archive/2006/12/19/597260.html,如需转载请自行联系原作者
目录
相关文章
|
1月前
|
前端开发
业余时间开发了个海报编辑器
为了满足撰写博客或录制教程视频时对高质量海报的需求,我利用业余时间开发了一款海报编辑器。第一版功能简单,支持固定尺寸、黑底白字的标题。后来经过优化,增加了背景图、模糊效果、文字样式调整等功能,使海报更具吸引力。目前该编辑器已上线,欢迎大家试用并反馈。[访问海报编辑器](https://tool.share888.top/#/poster)
77 6
业余时间开发了个海报编辑器
|
4月前
|
存储 安全 数据安全/隐私保护
Django 后端架构开发:富文本编辑器权限管理与 UEditor 、Wiki接入,实现 Markdown 文本编辑器
Django 后端架构开发:富文本编辑器权限管理与 UEditor 、Wiki接入,实现 Markdown 文本编辑器
182 0
|
5月前
|
移动开发 前端开发 JavaScript
基于 HTML5 和 Canvas 开发的在线图片编辑器
基于 HTML5 和 Canvas 开发的在线图片编辑器
113 0
|
6月前
|
存储 移动开发 编解码
基于HTML5开发的Markdown在线编辑器
Markdown是一种轻量级标记语言,以其简洁易读的格式而备受程序员和作者们的青睐。随着互联网的发展,越来越多的在线Markdown编辑器应运而生,为用户提供了更加便捷、高效的写作和编辑环境。本文将探讨基于HTML5开发的Markdown在线编辑器的设计原理、功能特点以及技术优势。
134 4
|
2月前
|
运维 Java Linux
【运维基础知识】掌握VI编辑器:提升你的Java开发效率
本文详细介绍了VI编辑器的常用命令,包括模式切换、文本编辑、搜索替换及退出操作,帮助Java开发者提高在Linux环境下的编码效率。掌握这些命令,将使你在开发过程中更加得心应手。
40 2
|
5月前
|
小程序
【微信小程序-原生开发】富文本编辑器 editor 的使用教程
【微信小程序-原生开发】富文本编辑器 editor 的使用教程
683 0
【微信小程序-原生开发】富文本编辑器 editor 的使用教程
|
7月前
|
存储 移动开发 编解码
基于HTML5开发的Markdown在线编辑器
Markdown是一种轻量级标记语言,以其简洁易读的格式而备受程序员和作者们的青睐。随着互联网的发展,越来越多的在线Markdown编辑器应运而生,为用户提供了更加便捷、高效的写作和编辑环境。本文将探讨基于HTML5开发的Markdown在线编辑器的设计原理、功能特点以及技术优势。
84 1
基于HTML5开发的Markdown在线编辑器
|
5月前
|
搜索推荐 C#
XAF 属性编辑器(PropertyEditor)- 原理篇
XAF Blazor 的 PropertyEditor 在 DEV 24.1.3 中经历了重大改进,更接近 WinForm。PropertyEditor 担任业务逻辑与各平台交互的角色,利用 INotifyPropertyChanged 监听属性变化。新版本弃用了 ComponentAdapter,代之以接口和基类,简化自定义编辑器的创建,降低了复杂度,同时增加了 ComponentModel 的 ComponentType 属性以自动化组件渲染和属性映射。这使得 Blazor 的 PropertyEditor 创建变得更为简便。
|
7月前
|
API 开发工具 C++
【专栏:工具与技巧篇】使用代码编辑器(VS Code/Sublime Text)提升开发效率
【4月更文挑战第30天】在VS Code与Sublime Text两大流行代码编辑器中,开发者可借助其高效特性提升编程效率。VS Code拥有丰富的插件生态、内置Git集成、强大的调试工具、智能提示和多文件导航功能。Sublime Text则以其轻量级、快速响应、多光标编辑及自定义构建系统见长。学习编辑器的键盘快捷键、自定义配置、使用内置终端以及键绑定和宏,将助开发者进一步提高开发效率。选择适合自己的编辑器并不断适应新技术是提升开发工作流的关键。
319 1
|
7月前
|
前端开发 Java Maven
属性编辑器未在PropertyEditorManager中注册?
属性编辑器未在PropertyEditorManager中注册?