程序需要做一个带下拉菜单的文本框以方便用户输入,大概类似于下图中这种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";
- 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();
- }
- }
- }
发表评论:
◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。