C# FORM 自定义控件:带弹出(下拉)菜单的TextBox

来源:互联网 发布:windows store app 编辑:程序博客网 时间:2024/05/21 09:35

原地址:http://blog.csdn.net/rrrrssss00/article/details/5792675

 

程序需要做一个带下拉菜单的文本框以方便用户输入,大概类似于下图中这种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();            }        }            }


 

0 0
原创粉丝点击