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


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

    2017年05月31日 13:50:58 ~typhoon~ 阅读数 5669

    程序需要做一个带下拉菜单的文本框以方便用户输入,大概类似于下图中这种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();
    
    }
    
    }
    
    }
  • 相关阅读:
    VS2012 打包部署程序
    请求筛选模块被配置为拒绝包含 hiddenSegment 节的 URL 中的路径
    “远程服务器返回错误: (404) 未找到”的正确解决方法
    23.IDEA 运行junit单元测试方法
    Java单元测试之JUnit篇
    22.IntelliJ IDEA 切换 project
    21. 【intellij idea】Project Structure 讲解
    一个多maven项目聚合的实例
    解决Maven项目相互依赖/循环依赖/双向依赖的问题
    20. idea刷新项目、清除项目缓存
  • 原文地址:https://www.cnblogs.com/grj001/p/12224396.html
Copyright © 2020-2023  润新知