当前位置:编程学习 > C#/ASP.NET >>

做一个textbox+button的组合控件

想做一个textbox+button的组合控件,主要实现按button弹出 各种共公选择窗口,如选部门,选货品,选人员...
返值给textbox。 button不显示时,textbox的宽度要加上button的宽度。它们要在同一水平位置上。

附带实现 是否为空,各种数据类型、正则表示式等判断就更好。但主要是实现上面的。
不知是否有人已经做出来了。

以下是我在网上找的一段代码,但没写怎么来使用。现把代码贴出,请高人指点。如果你手里有现成的,希望能分享。
文章都为原创, 任何人引用都请注明出处,并包含本声明
///作者: CSDN网名alias88,邮件:alias88@163.com,QQ:63343

using System;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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;

}

}


}

}


--------------------编程问答-------------------- 好长 --------------------编程问答-------------------- 如果上面的代码是正确的话,把它加入项目后,在工具箱就有那个控件的按钮,拖到界面中即可。 --------------------编程问答-------------------- --------------------编程问答--------------------  好 很好 --------------------编程问答-------------------- 不难  这代码也太长了。。。。 --------------------编程问答-------------------- 哎。。。不是一般的长。。。 --------------------编程问答-------------------- 纯JS就可以做出来的说。。。不过没实践过~ --------------------编程问答-------------------- 这个是用户控件吧?应改不是自定义控件吧?
发放到用户控件里,第一行就出错了。
using System;<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
--------------------编程问答-------------------- using System很明显的后台代码
补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,