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,如需转载请自行联系原作者


相关文章
|
7月前
gridcontrol 使用checkboxselectorfield的奇葩问题
gridcontrol 使用checkboxselectorfield的奇葩问题
|
JavaScript Android开发
第二十六章:自定义布局(十)
不允许无约束的尺寸!有时您希望在屏幕上看到所有内容,可能是一系列大小统一的行和列。您可以使用带有星号定义的所有行和列定义的Grid执行类似的操作,以使它们具有相同的大小。唯一的问题是您可能还希望行数和列数基于子节点数,并针对屏幕空间的最佳使用进行了优化。
801 0
|
存储 缓存 JavaScript
第二十六章:自定义布局(九)
编码的一些规则从上面的讨论中,您可以为自己的Layout 衍生物制定几个规则:规则1:如果布局类定义了诸如间距或方向等属性,则这些属性应由可绑定属性支持。 在大多数情况下,这些可绑定属性的属性更改处理程序应调用InvalidateLayout。
2041 0
|
JavaScript Android开发
第二十六章:自定义布局(八)
失效假设您已在页面上组装了一些布局和视图,并且由于某种原因,代码隐藏文件(或者可能是触发器或行为)会更改Button的文本,或者可能只是字体大小或属性。 该更改可能会影响按钮的大小,这可能会对页面其余部分的布局更改产生连锁反应。
3387 0
|
JavaScript Android开发
第二十六章:自定义布局(七)
垂直和水平定位简化在VerticalStack中,LayoutChildren覆盖的末尾是一个switch语句,它有助于根据子级的HorizontalOptions属性设置水平定位每个子级。 这是整个方法: public class VerticalStack : Layout<View> { ...
854 0
|
JavaScript Android开发
第二十六章:自定义布局(六)
从Layout派生 我们现在拥有足够的知识来创建我们自己的布局类。布局中涉及的大多数公共和受保护方法都是由非泛型布局类定义的。 Layout 类派生自Layout,并将泛型类型约束为View及其派生类。
742 0
|
JavaScript Android开发 iOS开发
第二十六章:自定义布局(五)
内视过程中本章到目前为止提供的大部分信息都是从包含派生自各种元素(如StackLayout,ScrollView和Label)的类的测试程序汇编而来,覆盖虚拟方法(如GetSizeRequest,OnSizeRequest,OnSizeAllocated和LayoutChildren) ,并使用System.Diagnostics命名空间中的Debug.WriteLine方法在Visual Studio或Xamarin Studio的“输出”窗口中显示信息。
743 0
|
Android开发
第二十六章:自定义布局(四)
无限约束现在这里有一些标记,起初看起来与前面的例子非常相似,但有很大的不同: <ContentPage __ Padding="20"> <StackLayout> <Label Text="Sample text" /> __ </StackLayout> </ContentPage> ContentPage仍然使用参数(0,0,360,640)进行初始布局调用,而LayoutChildren覆盖的参数是(20,20,320,600)。
679 0
|
JavaScript Android开发
第二十六章:自定义布局(三)
约束和大小请求您刚刚看到LayoutChildren覆盖在某些情况下如何仅基于LayoutChildren参数调用其子或子上的Layout。 但在更一般的情况下,LayoutChildren需要在调用子项的Layout方法之前知道其子项的大小。
660 0
|
JavaScript Android开发
第二十六章:自定义布局(二)
尺寸和定位布局过程从可视树的顶部开始,然后通过可视树的所有分支继续进行,以包含页面上的每个可视元素。 作为其他元素的父母的元素负责相对于他们自己的孩子的大小调整和定位。 这要求父元素调用子元素中的某些公共方法。
946 0