C# FORM 自定义控件:带弹出(下拉)菜单的TextBox
2014-02-26 12:57
387 查看
原地址:http://blog.csdn.net/rrrrssss00/article/details/5792675
程序需要做一个带下拉菜单的文本框以方便用户输入,大概类似于下图中这种TextBox:
控件有一个数据源,用的DataTable格式,还有一个值columnName来表示用Table中的哪一列数据,控件将根据这一列的数据来进行下拉框提示.
界面只添加了一个文本框和一个ListBox,
组件生成器中的代码为:
类代码为:
程序需要做一个带下拉菜单的文本框以方便用户输入,大概类似于下图中这种TextBox:
控件有一个数据源,用的DataTable格式,还有一个值columnName来表示用Table中的哪一列数据,控件将根据这一列的数据来进行下拉框提示.
界面只添加了一个文本框和一个ListBox,
组件生成器中的代码为:
#region 组件设计器生成的代码 /// <summary> /// 设计器支持所需的方法 - 不要 /// 使用代码编辑器修改此方法的内容。 /// </summary> private void InitializeComponent() { this.textBox1 = new System.Windows.Forms.TextBox(); this.listBox1 = new System.Windows.Forms.ListBox(); this.SuspendLayout(); // // textBox1 // this.textBox1.Dock = System.Windows.Forms.DockStyle.Top; this.textBox1.Location = new System.Drawing.Point(0, 0); this.textBox1.Name = "textBox1"; this.textBox1.Size = new System.Drawing.Size(189, 21); this.textBox1.TabIndex = 0; this.textBox1.TextChanged += new System.EventHandler(this.textBox1_TextChanged); this.textBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.textBox1_KeyDown); this.textBox1.Leave += new System.EventHandler(this.textBox1_Leave); // // listBox1 // this.listBox1.Dock = System.Windows.Forms.DockStyle.Fill; this.listBox1.FormattingEnabled = true; this.listBox1.ItemHeight = 12; this.listBox1.Location = new System.Drawing.Point(0, 21); this.listBox1.Name = "listBox1"; this.listBox1.Size = new System.Drawing.Size(189, 4); this.listBox1.TabIndex = 1; this.listBox1.Leave += new System.EventHandler(this.listBox1_Leave); this.listBox1.DoubleClick += new System.EventHandler(this.listBox1_DoubleClick); this.listBox1.KeyDown += new System.Windows.Forms.KeyEventHandler(this.listBox1_KeyDown); // // TextBoxWithDataPick // this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 12F); this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font; this.Controls.Add(this.listBox1); this.Controls.Add(this.textBox1); this.Name = "TextBoxWithDataPick"; 4000 this.Size = new System.Drawing.Size(189, 25); this.Load += new System.EventHandler(this.TextBoxWithDataPick_Load); this.ResumeLayout(false); this.PerformLayout(); } #endregion private System.Windows.Forms.TextBox textBox1; private System.Windows.Forms.ListBox listBox1;
类代码为:
public partial class TextBoxWithDataPick : UserControl { public TextBoxWithDataPick() { InitializeComponent(); } /// <summary>文本</summary> public string text { get{ return textBox1.Text; } set{ textBox1.Text = value;} } /// <summary>可供用户选择的数据集</summary> public DataTable dataSource = null; /// <summary>在dataSource中的列名</summary> public string columnName = ""; private void TextBoxWithDataPick_Load(object sender, EventArgs e) { //控件载入时,将高度缩为与TextBox相等 this.Height = textBox1.Height; } private void textBox1_TextChanged(object sender, EventArgs e) { if (this.textBox1.Text == "" ) { this.Height = textBox1.Height; this.listBox1.Visible = false; this.SendToBack(); return; } //这些情况下,不弹出选择框 if (dataSource == null || columnName == "" || !dataSource.Columns.Contains(columnName)) return; //根据用户当前输入的内容,筛选出与内容相符的记录,显示在列表框中 this.listBox1.Items.Clear(); for (int i = 0; i < dataSource.Rows.Count; i++) { if (dataSource.Rows[i][columnName].ToString().IndexOf(textBox1.Text) == 0) { listBox1.Items.Add(dataSource.Rows[i][columnName].ToString()); } } //如果记录数不为0,则将列表显示出来 if (listBox1.Items.Count == 0) { this.Height = textBox1.Height; this.listBox1.Visible = false; this.SendToBack(); } else { if (listBox1.Items.Count == 1) { this.Height = textBox1.Height + 20 * listBox1.Items.Count; this.listBox1.Visible = true; this.BringToFront(); } else if (listBox1.Items.Count<8) { this.Height = textBox1.Height + 14 * listBox1.Items.Count; this.listBox1.Visible = true; this.BringToFront(); } else { this.Height = textBox1.Height + 108; this.listBox1.Visible = true; this.BringToFront(); } } } //用户在焦点为listBox1时按下回车,将当前选中的内容提交到TextBox中,并隐藏ListBox private void listBox1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyValue == (int)Keys.Enter) { this.textBox1.Text = listBox1.SelectedItem.ToString(); this.Height = textBox1.Height; this.listBox1.Visible = false; this.SendToBack(); } } //用户双击listBox1某项时,将当前选中的内容提交到TextBox中,并隐藏ListBox private void listBox1_DoubleClick(object sender, EventArgs e) { if (listBox1.SelectedItem != null) { this.textBox1.Text = listBox1.SelectedItem.ToString(); this.Height = textBox1.Height; this.listBox1.Visible = false; this.SendToBack(); } } //用户在TextBox中点击向下箭头时,将焦点交给ListBox,使用户能够选择其中的项 private void textBox1_KeyDown(object sender, KeyEventArgs e) { if (e.KeyValue == (int)Keys.Down) { if (listBox1.Items.Count != 0) { listBox1.Focus(); listBox1.SelectedIndex = 0; } } } //TextBox失去焦点时,隐藏ListBox private void textBox1_Leave(object sender, EventArgs e) { if (listBox1.Focused == false) { this.Height = textBox1.Height; this.listBox1.Visible = false; this.SendToBack(); } } private void listBox1_Leave(object sender, EventArgs e) { if (textBox1.Focused == false) { this.Height = textBox1.Height; this.listBox1.Visible = false; this.SendToBack(); } } }
相关文章推荐
- C# FORM 自定义控件:带弹出(下拉)菜单的TextBox
- C#textbox右击弹出菜单
- jquery 下拉弹出菜单
- 《十天学会web标准(div+css)》之第八天:下拉及多级弹出菜单
- [WPF]DataGrid C#添加右键弹出选择菜单
- c#的自定义控件中的属性像Items一样打开一个form的做法
- 第八天 下拉及多级弹出菜单
- 自定义控件(js弹出框方式和自带验证控件)验证textbox
- css+html+js实现下拉及多级弹出菜单
- C# TreeView树控件,失去焦点仍然高亮显示,右击节点时才弹出右键菜单,空白处右击不弹出菜单
- C#TreeView窗体版点击右键弹出菜单+右键获取信息
- 用c#为listview 的项添加右键菜单,菜单仅在选中项弹出
- Android仿微信滑动弹出编辑、删除菜单效果、增加下拉刷新功能
- [导入]C# Tips 2 右键单击listBox时弹出右键菜单并选中单击的行
- <win8>(三)实例讲解win8(XAML+C#)开发--------课程表:弹出菜单ContextMenu和弹窗Flyout
- android弹出下拉选择菜单,单选,多选
- [转]【C#】分享一个弹出浮动层,像右键菜单那样召即来挥则去
- 十天学会web标准(DIV+CSS)系列(八)下拉及多级弹出菜单
- <win8>(三)实例讲解win8(XAML+C#)开发--------课程表:弹出菜单ContextMenu和弹窗Flyout
- android学习笔记之下拉动态弹出图标菜单的实现