实现了Format和NullText属性并且带按钮的文本框

类别:.NET开发 点击:0 评论:0 推荐:


///如未特别说明,本人所发表的技术文章都为原创, 任何人引用都请注明出处,并包含本声明
///作者: 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