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)。于是便尝试了一下。

代码:

ExpandedBlockStart.gif
复制代码
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

namespace WindowsFormsApplication1 

     class TestControl : System.Windows.Forms.TextBox, Green.SmartUIControls.ISmartUIControl 
    { 
        [System.ComponentModel.Browsable( true)] 
        [System.ComponentModel.DefaultValue( null)] 
        [System.ComponentModel.Description( " 数据绑定匹配属性 ")] 
        [System.ComponentModel.Category( " Green.SmartUIControl ")] 
        [System.ComponentModel.DisplayName(ControlResource.Data)] 
         public  string Data 
        {  getset; } 

         #region ISmartUIControl 成员 
         private Green.SmartUIControls.IDataBindSetting _DataBindSetting; 
        [System.ComponentModel.Browsable( false)] 
         public Green.SmartUIControls.IDataBindSetting DataBindSetting 
        { 
             get 
            { 
                 if (_DataBindSetting ==  null && ! this.DesignMode) 
                { 
                    _DataBindSetting =  new Green.SmartUIControls.DefaultDataBindSetting( this); 
                } 
                 return _DataBindSetting; 
            } 
             set 
            { 
                 if (value !=  null
                { 
                    _DataBindSetting = value; 
                } 
            } 
        } 
        [System.ComponentModel.Browsable( true)] 
        [System.ComponentModel.DefaultValue( null)] 
        [System.ComponentModel.Description( " 数据绑定匹配属性 ")] 
        [System.ComponentModel.Category( " Green.SmartUIControl ")] 
        [System.ComponentModel.DisplayName(ControlResource.DataBindProperty)] 
         public  string DataBindProperty 
        { 
             get
             set
        } 

        [System.ComponentModel.Browsable( true)] 
        [System.ComponentModel.DefaultValue( null)] 
        [System.ComponentModel.Description( " Dock ")] 
        [System.ComponentModel.Category( " Green.SmartUIControl ")] 
        [System.ComponentModel.DisplayName(ControlResource.Dock)] 
         public  override System.Windows.Forms.DockStyle Dock 
        { 
             get 
            { 
                 return  base.Dock; 
            } 
             set 
            { 
                 base.Dock = value; 
            } 
        } 
         #endregion 
    } 

     public  class ControlResource 
    { 
#if Debug 
         public  const  string Dock =  " Dock "
         public  const  string DataBindProperty =  " DataBindProperty "
         public  const  string Data =  " Data "
#else 

         public  const  string Dock =  " 停靠 "
         public  const  string DataBindProperty =  " 数据绑定匹配属性 "
         public  const  string Data =  " 数据 "
#endif 
    } 
}
复制代码

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

看图:

设置Dock=Top:

QQ截图未命名2

设置Dock=Bottom:

QQ截图未命名

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


作者:破  狼 
出处:http://www.cnblogs.com/whitewolf/ 
本文版权归作者,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。该文章也同时发布在我的独立博客中-个人独立博客博客园--破狼51CTO--破狼。http://www.cnblogs.com/whitewolf/archive/2012/02/11/2347096.html


相关文章
|
7月前
gridcontrol 使用checkboxselectorfield的奇葩问题
gridcontrol 使用checkboxselectorfield的奇葩问题
|
9月前
|
C#
极度偷懒 - 实现算命程序中tabcontrol的“美化”
极度偷懒 - 实现算命程序中tabcontrol的“美化”
46 0
艾伟:控件之ViewState
主题,控件的viewstate状态一“七七八八” 有次,朋友开玩笑说,不知道什么时候,微软会取消viewstate,不再使用隐藏字段在服务器与客户端保存状态!虽然,可以使用客户端技术减少一些回传,但是,一些必要的服务器状态还是要保存的,现在网络带宽已经不是问题,所以在网络上适当的传递一些状态数据,还...
736 0
|
C# Windows
艾伟_转载:C# WinForm开发系列 - TextBox
包含金额/日期输入框,带弹出数字面板的计算输入框,安全密码输入等控件(文章及相关代码搜集自网络,仅供参考学习,版权属于原作者! ).   1.CalculatorBox    CalculatorBox.
1357 0
|
Web App开发
艾伟:WinForm控件开发总结(四)-----控件属性的串行化
前一篇文章介绍了常用的设计时Attribute。其中BrowsableAttribute,CategoryAttribute,DescriptionAttribute,DefaultPropertyAttribute,DefaultEventAttribute都是比较简单的,也是可有可无,但是为了提供更好的用户体验这些Attribute最好不要省掉,如果你对这些Attribute还不熟悉,可以参考我前一篇文章的描述或者查看MSDN,这里我就不在赘述了。
932 0
|
JavaScript Android开发
第二十六章:自定义布局(十)
不允许无约束的尺寸!有时您希望在屏幕上看到所有内容,可能是一系列大小统一的行和列。您可以使用带有星号定义的所有行和列定义的Grid执行类似的操作,以使它们具有相同的大小。唯一的问题是您可能还希望行数和列数基于子节点数,并针对屏幕空间的最佳使用进行了优化。
801 0
|
存储 缓存 JavaScript
第二十六章:自定义布局(九)
编码的一些规则从上面的讨论中,您可以为自己的Layout 衍生物制定几个规则:规则1:如果布局类定义了诸如间距或方向等属性,则这些属性应由可绑定属性支持。 在大多数情况下,这些可绑定属性的属性更改处理程序应调用InvalidateLayout。
2041 0
|
JavaScript Android开发
第二十六章:自定义布局(八)
失效假设您已在页面上组装了一些布局和视图,并且由于某种原因,代码隐藏文件(或者可能是触发器或行为)会更改Button的文本,或者可能只是字体大小或属性。 该更改可能会影响按钮的大小,这可能会对页面其余部分的布局更改产生连锁反应。
3387 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

热门文章

最新文章