///如未特别说明,本人所发表的技术文章都为原创, 任何人引用都请注明出处,并包含本声明
///作者: CSDN网名alias88,邮件:[email protected],QQ:63343
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;
using System.Drawing.Drawing2D;
using System.ComponentModel.Design;
using System.Drawing.Design;
using System.Diagnostics;
namespace upSystem.upControls
{
/// <summary>
/// 实现了Format和NullText属性并且带按钮的文本框
/// </summary>
public class upButtonTextBox : System.Windows.Forms.TextBox
{
/// <summary>
/// 必需的设计器变量。
/// </summary>
private System.ComponentModel.Container components = null;
private Binding bd=null;
private TypeConverter typeConverter=null;
private IFormatProvider formatInfo=null;
private System.Reflection.MethodInfo parseMethod;
private string nullText="",format="";
private string _Format=string.Empty;
private Type dataType;
private System.Windows.Forms.Button _Button;
public event System.EventHandler CmdClick ;
public upButtonTextBox():base()
{
InitializeComponent();
this.DataBindings.CollectionChanged +=new CollectionChangeEventHandler(DataBindings_CollectionChanged);
}
/// <summary>
/// 清理所有正在使用的资源。
/// </summary>
protected override void Dispose( Boolean disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}
#region 组件设计器生成的代码
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this._Button = new System.Windows.Forms.Button();
this.SuspendLayout();
//
// _Button
//
this._Button.BackColor = System.Drawing.Color.ForestGreen;
this._Button.Cursor = System.Windows.Forms.Cursors.Default;
this._Button.Dock = System.Windows.Forms.DockStyle.Right;
this._Button.Location = new System.Drawing.Point(76, 0);
this._Button.Name = "_Button";
this._Button.Size = new System.Drawing.Size(20, 17);
this._Button.TabIndex = 0;
this._Button.Text = ">";
this._Button.Visible = false;
this._Button.Click += new System.EventHandler(this.btnCommand_Click);
//
// upButtonTextBox
//
this.Controls.Add(this._Button);
this.ResumeLayout(false);
}
#endregion
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private void DataBindings_CollectionChanged(object sender, CollectionChangeEventArgs e)
{
try
{
dataType=null;
if (bd!=null)
{
bd.Parse -= new ConvertEventHandler(bd_Parse);
bd.Format -= new ConvertEventHandler(bd_Format);
}
bd= DataBindings["Text"];
if (bd!=null)
{
bd.Parse += new ConvertEventHandler(bd_Parse);
bd.Format += new ConvertEventHandler(bd_Format);
if (bd.BindingManagerBase !=null)
DataType=bd.BindingManagerBase.GetItemProperties()[bd.BindingMemberInfo.BindingField ].PropertyType;
}
}
catch{throw;}
}
[
Category("格式"),
Editor(typeof(upTypeSelectEditor), typeof(UITypeEditor)),
DefaultValue(typeof (System.String)),
Description("文本框的数据类型")
]
public Type DataType
{
get{return dataType;}
set
{
dataType=value;
if (dataType!=null && dataType != typeof(object))
{
this.typeConverter = TypeDescriptor.GetConverter(dataType);
Type[] typeArray1 = new Type[2] { typeof(string), typeof(IFormatProvider) } ;
this.parseMethod = dataType.GetMethod("Parse", typeArray1);
}
}
}
[
Category("格式"),
DefaultValue("无"),
Description("值为Null要显示的值")
]
public string NullText
{
get{return nullText;}
set{nullText=value; }
}
[
Category("格式"),
Editor(typeof(upFormatEditor), typeof(UITypeEditor)),
DefaultValue(String.Empty),
Description("格式字符串")
]
public string Format
{
get
{
return _Format;
}
set
{
if (value == null)
{
value = string.Empty;
}
if ((_Format == null) || !_Format.Equals(value))
{
_Format = value;
if (((_Format.Length == 0) && (this.typeConverter != null))
&& !this.typeConverter.CanConvertFrom(typeof(string)))
{
this.ReadOnly = true;
}
this.Invalidate();
}
}
}
[Browsable(false), EditorBrowsable(EditorBrowsableState.Advanced)]
public IFormatProvider FormatInfo
{
get
{
return this.formatInfo;
}
set
{
if ((this.formatInfo == null) || !this.formatInfo.Equals(value))
{
this.formatInfo = value;
}
}
}
private void bd_Format(object sender, ConvertEventArgs e)
{
try
{
if (!bd.IsBinding ) return ;
e.Value =FormatValue(e.Value );
}
catch (System.Exception ex )
{
upApp.HaveErr((Control)sender,new Exception ( "数据类型不合格\n",ex),1);
}
}
private void bd_Parse(object sender, ConvertEventArgs e)
{
try
{
if (!bd.IsBinding ) return ;
e.Value =ParseValue ( e.Value );
}
catch ( System.Exception ex)
{
upApp.HaveErr((Control)sender,new Exception ( "数据类型不合格\n",ex),1);
}
}
/// <summary>
/// 将文本框要显示的值格式化
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private string FormatValue(object value)
{
if (value is DBNull || value ==null)
{
return this.NullText;
}
try
{
if (((this.format != null) && (this.format.Length != 0)) && (value is IFormattable))
{
return ((IFormattable) value).ToString(this.format, this.formatInfo);
}
else if ((this.typeConverter != null) && this.typeConverter.CanConvertTo(typeof(string)))
{
return ((string) this.typeConverter.ConvertTo(value, typeof(string)));
}
throw new Exception ();
}
catch
{
if (value == null) return string.Empty;
return value.ToString();
}
}
/// <summary>
/// 将文本框格式化后的值还原可接受的值
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
private object ParseValue(object value)
{
try
{
if (this.NullText.Equals(value))
{
return Convert.DBNull;
}
else if (((this.format != null) && (this.format.Length != 0)) && (this.parseMethod != null) && (this.FormatInfo != null))
{
object[] objArray1 = new object[2] { value, this.FormatInfo } ;
return this.parseMethod.Invoke(null, objArray1);
}
else if ((this.typeConverter != null) && this.typeConverter.CanConvertFrom(typeof(string)))
{
return this.typeConverter.ConvertFrom (value);
}
throw new Exception ();
}
catch (Exception)
{
return Convert.DBNull ;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/// <summary>
/// 内嵌的按钮
/// </summary>
public Button Button
{
get{return _Button;}
}
/// <summary>
/// 是否显示按钮
/// </summary>
public System.Boolean ShowButton
{
get{return this.Button.Visible ;}
set{Button.Visible=value;}
}
private void btnCommand_Click(object Sender, System.EventArgs e)
{
OnCmdClick (this,e);
}
protected void OnCmdClick (object Sender,System.EventArgs e )
{
if (CmdClick!=null) CmdClick(Sender,e);
}
protected override void OnBorderStyleChanged(EventArgs e)
{
base.OnBorderStyleChanged (e);
switch (this.BorderStyle)
{
case BorderStyle.Fixed3D:
this.Button.FlatStyle=FlatStyle.Standard ;
break;
case BorderStyle.FixedSingle :
this.Button.FlatStyle=FlatStyle.Popup ;
break;
case BorderStyle.None :
this.Button.FlatStyle=FlatStyle.Flat ;
break;
}
}
private void upTextBox_Enter(object Sender, System.EventArgs e)
{
if (ShowButton && Button.Visible ==false )
{
Button.Visible =true;
}
}
private void upTextBox_Leave(object Sender, System.EventArgs e)
{
if (Button.Visible )
{
Button.Visible =false;
}
}
}
}
本文地址:http://com.8s8s.com/it/it42117.htm