dev的labelcontrol自动换行_玩转控件:封装Dev的LabelControl和TextEdit

本文介绍了如何封装Dev的LabelControl和TextEdit,使其在多语言环境下自动换行。通过创建基类并实现通用属性、方法和事件,简化了用户控件的开发。文章详细展示了基类的属性如AllowEdit、MessageCode等,以及子类的自定义属性如KzxBorderStyle、IsNull等。最后展示了控件的运行效果,强调有效封装能提高开发效率,并提供源码获取方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

//获取多语言文本事件委托//事件发起者 ///语言标识 ///多语言的文本 publicdelegatevoidKzxGetLanguageEventHandler( objectsender, stringmessageCode, refstringtext);publicinterfaceIControl{//有Load方法///boolHasLoad { get; }

//被引用后允许修改///true允许,false不允许///boolAllowEdit { get; set; }

//多语言环境下显示文本的对应标识///stringMessageCode { get; set; }

//设计时的显示,方便设计员工识别///stringDesigeCaption { get; set; }

//控件的唯一标识///stringKey { get; set; }

//True控件可用,False控件不可用///Boolean Enabled { get; set; }

//True控件可见,False控件不可见///Boolean Visible { get; set; }

//Tag标志,用于存储任何数据///objectTag { get; set; }

//设计时的可用性///Boolean DesigeEnabled { get; set; }......

用户控件父类,主要集中所有用户控件的通用属性、方法和事件,部分代码如下:

privatebool_AllowEdit = true;//被引用后允许修改///true允许,false不允许///[ Category( "验证"), Deion( "AllowEdit,被引用后允许修改,true允许,false不允许"), Browsable(true)][ McDisplayName( "AllowEdit")]publicvirtualboolAllowEdit{get{returnthis._AllowEdit;}set{this._AllowEdit = value;}}privatestring_MessageCode = "0";//多语言环境下显示文本的对应标识///[ Category( "多语言"), Deion( "MessageCode,多语言环境下显示文本的对应标识"), Browsable(true)][ McDisplayName( "MessageCode")]publicvirtualstringMessageCode{get{returnthis._MessageCode;}set{this._MessageCode = value;}}privatestring_DesigeCaption = "显示标题";//没有多语言的情况下的默认显示标题///[ Category( "多语言"), Deion( "DesigeCaption,没有多语言的情况下的默认显示标题"), Browsable(true)][ McDisplayName( "DesigeCaption")]publicvirtualstringDesigeCaption{get{returnthis._DesigeCaption;}set{this._DesigeCaption = value;}}privatestring_Key = string.Empty;//控件的唯一标识///[ Category( "数据"), Deion( "Key,控件的唯一标识"), Browsable(true)][ McDisplayName( "Key")]publicvirtualstringKey{get{if( string.IsNullOrWhiteSpace( this._Key) == true){if( string.IsNullOrWhiteSpace( this.Table) == false&& string.IsNullOrWhiteSpace( this.Field) == false){this._Key = this.Table + "."+ this.Field;}elseif( string.IsNullOrWhiteSpace( this.Table) == false){this._Key = this.Table;}}if( string.IsNullOrEmpty( this._Key)) returnthis.Name;returnthis._Key;}set{this._Key = value;}}privatebool_DesigeEnabled = true;//设计时的可用性///[ Category( "特性"), Deion( "DesigeEnabled,设计时的可用性"), Browsable(true)][ McDisplayName( "DesigeEnabled")]publicvirtualboolDesigeEnabled{get{returnthis._DesigeEnabled;}set{this._DesigeEnabled = value;//this.Enabled = value;}}privatebool_DesigeVisible = true;//设计时可见性///[ Category( "特性"), Deion( "DesigeVisible,设计时可见性"), Browsable(true)][ McDisplayName( "DesigeVisible")]publicvirtualboolDesigeVisible{get{returnthis._DesigeVisible;}set{this._DesigeVisible = value;//this.Visible = value;if( this.DesignMode == true){if( value== false){this.BorderStyle = BorderStyle.Fixed3D;}else{this.BorderStyle = BorderStyle.None;}}else{//this.Visible = value;}}}

//触发控件事件//事件发起者 ///事件名称 ///事件参数 protectedvirtualvoidRaiseEvent( objectsender, stringeventName, objecte){ControlEventArgs args = newControlEventArgs;args.CurrentControl = sender;args.EventId = eventName;args.SystemEventArgs = e;args.FieldName = this.Field;args.TableName = this.Table;args.Key = this.Key;if( this.KzxControlOperate != null){this.KzxControlOperate( this, args);e = args.SystemEventArgs;}}privatestaticMethodInfo _methodInfo = null;

//获取多语言文本//语言文本标识 ///默认的文本 ///取到的文本 protectedvirtualstringGetLanguage( stringmessageCode, stringdefaultMessage){stringtext = string.Empty;

try{text = defaultMessage;stringfilepath = System.IO.Path.Combine(AppDomain.CurrentDomain.SetupInformation.ApplicationBase, "KzxCommon.dll");Assembly assembly = null;objectobj = null;

Assembly[] assemblies = AppDomain.CurrentDomain.GetAssemblies;for( inti = 0; i < assemblies.Length; i++){if(assemblies[i].GetName.Name.Equals( "KzxCommon", StringComparison.OrdinalIgnoreCase) == true){assembly = assemblies[i];break;}}if(assembly == null){assembly = Assembly.LoadFrom(filepath);}obj = assembly.CreateInstance( "KzxCommon.sysClass");text = defaultMessage;if(_methodInfo == null){if(obj != null){_methodInfo = obj.GetType.GetMethod( "ssLoadMsg", BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic);if(_methodInfo != null){text = _methodInfo.Invoke(obj, newobject[] { messageCode }).ToString;}}}else{text = _methodInfo.Invoke(obj, newobject[] { messageCode }).ToString;}}catch(Exception ex){

}returnstring.IsNullOrWhiteSpace(text) == true? defaultMessage : text;}

protectedvirtualvoidOnKzxBaseControlLoad( ){objectobj = null;PropertyInfo pi = null;for( inti = 0; i < this.Controls.Count; i++){if( this.Controls[i].Name.Equals( "ValueControl", StringComparison.OrdinalIgnoreCase) == true){pi = this.Controls[i].GetType.GetProperty( "ErrorIconAlignment");if(pi != null){pi.SetValue( this.Controls[i], ErrorIconAlignment.TopRight, null);}}}}

protectedoverridevoidOnControlAdded( System.Windows.Forms.ControlEventArgs e){base.OnControlAdded(e);OnKzxBaseControlLoad;SetAppearance;}

介绍完基类,我们新建在新建要给用户控件来继承它,并实现业务需求:

//文本框验证///[ ToolboxBitmapAttribute(typeof(Bitmap), "文本框")]publicpartialclassKzxTextBox: KzxBaseControl

布局方面,应自己要求,气运丹田,使出拖控件大法!

4364fa2998b2ed2d33c47a5681b0d2f2.png

此处无需做任何属性、事件设置。只需把我们日常常用到的属性、事件,用特性标记起来即可。部分代码如下:

privateDevExpress.XtraEditors.Controls.BorderStyles _BorderStyle = DevExpress.XtraEditors.Controls.BorderStyles.Default;//边框显示格式///[ Category( "数据格式"), Deion( "KzxBorderStyle,边框显示格式"), Browsable(true)][ McDisplayName( "KzxBorderStyle")]publicoverrideDevExpress.XtraEditors.Controls.BorderStyles KzxBorderStyle{get{returnthis.ValueControl.Properties.BorderStyle;}set{this._BorderStyle = value;this.ValueControl.Properties.BorderStyle = value;}}//没有多语言的情况下的默认显示标题///[ Category( "多语言"), Deion( "DesigeCaption,没有多语言的情况下的默认显示标题"), Browsable(true)][ McDisplayName( "DesigeCaption")]publicoverridestringDesigeCaption{get{returnthis.CaptionControl.Text.Trim;}set{this.CaptionControl.Text = value;}}

privatebool_IsNull = true;//可空性///[ Category( "验证"), Deion( "IsNull,可空性"), Browsable(true)][ McDisplayName( "IsNull")]publicoverrideboolIsNull{get{SetBackColor;returnthis._IsNull;}set{this._IsNull = value;SetBackColor;}}

//只读性///[ Category( "验证"), Deion( "ReadOnly,只读性"), Browsable(true)][ McDisplayName( "ReadOnly")]publicoverrideboolReadOnly{get{SetBackColor;returnthis.ValueControl.Properties.ReadOnly;}set{this.ValueControl.Properties.ReadOnly = value;SetBackColor;if( value== false){this.ValueControl.BackColor = Color.White;}}}

privateintmaxLength = 0;//可录入的最大长度///[ Category( "验证"), Deion( "MaxLength,可录入的最大长度"), Browsable(true)][ McDisplayName( "MaxLength")]publicoverrideintMaxLength{get{returnmaxLength;}set{maxLength = value;}}

privateInt32 _CaptionLabelWidth = 75;//显示标题宽度///[ Category( "外观"), Deion( "CaptionLabelWidth,显示标题宽度"), Browsable(true)][ McDisplayName( "CaptionLabelWidth")]publicInt32 CaptionLabelWidth{get{returnthis.CaptionControl.Width;}set{this._CaptionLabelWidth = value;this.CaptionControl.Width = value;}}

privatestringtoolTipMaxLengthText = string.Empty;//数据长度不能超过数据库长度提示文本///publicoverridestringToolTipMaxLengthText{get{ returntoolTipMaxLengthText; }set{ toolTipMaxLengthText = value; }}

//提示信息///[ Category( "汽泡提示"), Deion( "ToolTipText,提示信息"), Browsable(true)][ McDisplayName( "ToolTipText")]publicoverridestringToolTipText{get{return(ValueControl == null) == true? string.Empty : ValueControl.ToolTip;}set{if(ValueControl != null){ValueControl.ToolTip = value;}if(CaptionControl != null){CaptionControl.ToolTip = value;}}}

privatestring_ToolTipMessageCode = string.Empty;//提示多语言标识///[ Category( "汽泡提示"), Deion( "ToolTipMessageCode,提示信息多语言标识"), Browsable(true)][ McDisplayName( "ToolTipMessageCode")]publicoverridestringToolTipMessageCode{get{returnthis._ToolTipMessageCode;}set{this._ToolTipMessageCode = value;}}

一起看看用户控件效果以及封装的属性事件:

abddcab14be1c08c3636da3bf035bd1e.png

F5看看运行效果:

e228a72ce133d72464a365206f3d69c6.png

Done! 一个控件,减少一半操作量! 在此,本控件当作作者抛砖引玉,看官们可以根据自己实际情况进行数据封装。有效的封装,避免画蛇添足哦~

最后,由于后续所有重写/重绘控件都在同一个项目使用,而且Dev系统引用文件较多,压缩后源码文件仍然很大,如果有需要源码的朋友,可以微信公众号联系博主,源码可以免费赠予~!有疑问的也可以CALL我一起探讨,最最后,如果觉得本篇博文对您或者身边朋友有帮助的,麻烦点个关注!赠人玫瑰,手留余香,您的支持就是我写作最大的动力,感谢您的关注,期待和您一起探讨!再会!返回搜狐,查看更多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值