PropertyGrid无意的发现DisplayNameAttribute及应用

简介:

  说到这个winform属性控件PropertyGrid,要从以前参与项目架构研发,做报表引擎开始,当时我们的目的是想做一个比较简单的报表引擎没有RDLC等报表复杂,是为了让我们的可以操作,用户可以凭借表单拖拽设置样式完成报表模板设置,与我们开发人员代码实现的数据流结合,产生基于apose.cells的excel报表。把我们多而烦的报表业务交给用户完成,用户利用报表设计完成的模板保存为xml保存至服务器,工以后使用。当时做到表单控件属性设计无疑我们采用了PropertyGrid控件,PropertyGrid支持很多的控件设计时交互,很强大,但是对于控件的属性汉化却存在问题,当时也没仔细查阅msdn,直接让控件属性为中文字段设计完成,对用户提示。最后项目基本完成,能够应对简单报表,稍微减少了些开发工作量吧。

        在时隔今天做基本控件的封装的时候突然看见了System.ComponentModel.DisplayNameAttribute这个标签,见名就考虑是做什么的,查询msdn才知道他就可以完成对PropertyGrid的现实名称修改(http://msdn.microsoft.com/zh-cn/library/system.componentmodel.displaynameattribute(v=VS.80).aspx?TPSecNotice)。于是便尝试了一下。

代码:

 
  1. View Code   
  2.  
  3. using System;   
  4. using System.Collections.Generic;   
  5. using System.Linq;   
  6. using System.Text;   
  7.  
  8. namespace WindowsFormsApplication1   
  9. {   
  10.     class TestControl : System.Windows.Forms.TextBox, Green.SmartUIControls.ISmartUIControl   
  11.     {   
  12.         [System.ComponentModel.Browsable(true)]   
  13.         [System.ComponentModel.DefaultValue(null)]   
  14.         [System.ComponentModel.Description("数据绑定匹配属性")]   
  15.         [System.ComponentModel.Category("Green.SmartUIControl")]   
  16.         [System.ComponentModel.DisplayName(ControlResource.Data)]   
  17.         public string Data   
  18.         { get; set; }   
  19.  
  20.         #region ISmartUIControl 成员   
  21.         private Green.SmartUIControls.IDataBindSetting _DataBindSetting;   
  22.         [System.ComponentModel.Browsable(false)]   
  23.         public Green.SmartUIControls.IDataBindSetting DataBindSetting   
  24.         {   
  25.             get   
  26.             {   
  27.                 if (_DataBindSetting == null && !this.DesignMode)   
  28.                 {   
  29.                     _DataBindSetting = new Green.SmartUIControls.DefaultDataBindSetting(this);   
  30.                 }   
  31.                 return _DataBindSetting;   
  32.             }   
  33.             set   
  34.             {   
  35.                 if (value != null)   
  36.                 {   
  37.                     _DataBindSetting = value;   
  38.                 }   
  39.             }   
  40.         }   
  41.         [System.ComponentModel.Browsable(true)]   
  42.         [System.ComponentModel.DefaultValue(null)]   
  43.         [System.ComponentModel.Description("数据绑定匹配属性")]   
  44.         [System.ComponentModel.Category("Green.SmartUIControl")]   
  45.         [System.ComponentModel.DisplayName(ControlResource.DataBindProperty)]   
  46.         public string DataBindProperty   
  47.         {   
  48.             get;   
  49.             set;   
  50.         }   
  51.  
  52.         [System.ComponentModel.Browsable(true)]   
  53.         [System.ComponentModel.DefaultValue(null)]   
  54.         [System.ComponentModel.Description("Dock")]   
  55.         [System.ComponentModel.Category("Green.SmartUIControl")]   
  56.         [System.ComponentModel.DisplayName(ControlResource.Dock)]   
  57.         public override System.Windows.Forms.DockStyle Dock   
  58.         {   
  59.             get   
  60.             {   
  61.                 return base.Dock;   
  62.             }   
  63.             set   
  64.             {   
  65.                 base.Dock = value;   
  66.             }   
  67.         }   
  68.         #endregion   
  69.     }   
  70.  
  71.     public class ControlResource   
  72.     {   
  73. #if Debug   
  74.         public const string Dock = "Dock";   
  75.         public const string DataBindProperty = "DataBindProperty";   
  76.         public const string Data = "Data";   
  77. #else   
  78.  
  79.         public const string Dock = "停靠";   
  80.         public const string DataBindProperty = "数据绑定匹配属性";   
  81.         public const string Data = "数据";   
  82. #endif   
  83.     }   
  84. }  
  85. 复制代码 

        最后需要特别说明的是对于Attribute我们只能传入常量。在我们的很多开发员使用控件等时候我们也许都习惯了英文对于中文不适应了,但是我们可以利用vs的条件编译绕过,编译出不同的dll包,开发版和用户使用版本。如上面的对于调试和发布版的显示设置。这个ControlResource我们可以开发一个简单的工具对其xml保存并生成我们需要的代码维护。

看图:

设置Dock=Top:

设置Dock=Bottom:

       同时我也考虑到在我们的工作流自定义表单设计和代码生成工具等中我们也可以运用,表单设计的控件字段属性设置,保存为xml或者二级制,xaml存储之类。简单说一句对于silverlight,wpf 的对于我觉得保存为xaml是最简单的,我们可以直接保存xaml,并简单转换加入父容器中。






 本文转自 破狼 51CTO博客,原文链接:http://blog.51cto.com/whitewolfblog/834795,如需转载请自行联系原作者


相关文章
|
4月前
|
前端开发 定位技术
百度地图开发如何自定义控件(无敌的解决办法)
百度地图开发如何自定义控件(无敌的解决办法)
33 0
百度地图开发如何自定义控件(无敌的解决办法)
|
7月前
gridcontrol 使用checkboxselectorfield的奇葩问题
gridcontrol 使用checkboxselectorfield的奇葩问题
|
Windows C++
微软输入法TSF SampleIME 代码浅说
原文:微软输入法TSF SampleIME 代码浅说 微软提供了一个简单的TSF拼音输入法的示例SampleIME,主要的问题是:不支持数字键选候选字,不能自动上屏,没有联想功能。
1629 0
|
C#
WPF不明内存泄露已解决,白头发也没了
原文:WPF不明内存泄露已解决,白头发也没了      在使用OpenExpressApp进行WPF应用开发过程中遇到多个内存泄漏的地方,在上一篇中求助了一个内存泄露问题【WPF不明内存泄露原因,头发都白了几根】,本篇与大家分享一下如何解决此问题的过程。
1726 0
Devexpress treelist 控件属性大全
属性列表 1、OptionsSelection: EnableAppearanceForcusedCell:选中的Cell的Appearance设置是否可用。默认为True; EnableAppearanceForcusedRow:选中的Node的Appearance设置是否可用。
1692 0
|
开发者
[UWP]了解模板化控件(2):模仿ContentControl
原文:[UWP]了解模板化控件(2):模仿ContentControl ContentControl是最简单的TemplatedControl,而且它在UWP出场频率很高。ContentControl和Panel是VisualTree的基础,可以说几乎所有VisualTree上的UI元素的父节点中总有一个ContentControl或Panel。
1073 0
|
开发者 C# 程序员
[UWP]了解模板化控件(10):原则与技巧
原文:[UWP]了解模板化控件(10):原则与技巧 1. 原则 推荐以符合以下原则的方式编写模板化控件: 选择合适的父类:选择合适的父类可以节省大量的工作,从UWP自带的控件中选择父类是最安全的做法,通常的选择是Control、ContentControl、ItemsControl,也可以选择从RangeBase、Selector中。
1196 0
|
UED 容器
[UWP]了解模板化控件(2.1):理解ContentControl
原文:[UWP]了解模板化控件(2.1):理解ContentControl UWP的UI主要由布局容器和内容控件(ContentControl)组成。布局容器是指Grid、StackPanel等继承自Panel,可以拥有多个子元素的类。
1189 0
|
C# 开发者
[UWP]了解模板化控件(5):VisualState
原文:[UWP]了解模板化控件(5):VisualState 1. 功能需求 使用TemplatePart实现上篇文章的两个需求(Header为空时隐藏HeaderContentPresenter,鼠标没有放在控件上时HeaderContentPresent半透明),虽然功能已经实现,但这样实现的话基本上也就别想扩展了。
1164 0