专注收集记录技术开发学习笔记、技术难点、解决方案
网站信息搜索 >> 请输入关键词:
您当前的位置: 首页 > WinForm

自定义控件:带历史输入记要的筛选文本框

发布时间:2011-06-23 13:49:35 文章来源:www.iduyao.cn 采编人员:星星草
自定义控件:带历史输入记录的筛选文本框
 
        /*
         * 实现功能:
         * 1.输入字符长度超过设定值后,筛选出包含输入内容的项目显示在控件下(上)面的列表框中
         * 2.获得焦点时在控件下(上)面的列表框中显示最近的输入内容(区分不同程序/不同窗体/不同控件/不同用户)
         * 未实现功能:清理超过一定数量的历史输入记录
            使用方法:
            1. 创建历史输入表
            CREATE TABLE [dbo].[UserInputHistory] (
                [ProductName] VARCHAR (255) NULL,
                [FormName]    VARCHAR (255) NULL,
                [ControlName] VARCHAR (255) NULL,
                [UserID]      VARCHAR (255) NULL,
                [InputText]   VARCHAR (255) NULL,
                [ID]          INT           IDENTITY (1, 1) NOT NULL, 
                CONSTRAINT [PK_UserInputHistory] PRIMARY KEY ([ID])
            );

            2.在设计时填写控件属性附加类别里的内容;
            3.在Form_Load里加入Init();
             */

 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Text;
using System.Threading;

namespace werp
{
public class InputHistoryAndFilterTextBox : System.Windows.Forms.TextBox
{

/*
* 实现功能:
* 1.输入字符长度超过设定值后,筛选出包含输入内容的项目显示在控件下(上)面的列表框中
* 2.获得焦点时在控件下(上)面的列表框中显示最近的输入内容(区分不同程序/不同窗体/不同控件/不同用户)
* 未实现功能:清理超过一定数量的历史输入记录
使用方法:
1. 创建历史输入表
CREATE TABLE [dbo].[UserInputHistory] (
[ProductName] VARCHAR (255) NULL,
[FormName] VARCHAR (255) NULL,
[ControlName] VARCHAR (255) NULL,
[UserID] VARCHAR (255) NULL,
[InputText] VARCHAR (255) NULL,
[ID] INT IDENTITY (1, 1) NOT NULL,
CONSTRAINT [PK_UserInputHistory] PRIMARY KEY ([ID])
);

2.在设计时填写控件属性附加类别里的内容;
3.在Form_Load里加入Init();
*/
/// <summary>
/// 查询的表名
/// </summary>
/// <value>The name of the table.</value>
[Description("查询的表名"), Category("附加"), DefaultValue("t_item")]
public string TableName { get; set; } = "t_item";
/// <summary>
/// 筛选的字段名
/// </summary>
/// <value>The name of the field.</value>
[Description("筛选的字段名"), Category("附加"), DefaultValue("item_num")]
public string FieldName { get; set; } = "item_num";
/// <summary>
/// 筛选起始长度
/// </summary>
/// <value>The length of the find.</value>
[Description("筛选起始长度"), Category("附加"), DefaultValue(3)]
public int FindLength { get; set; } = 3;
/// <summary>
/// 附件查询条件
/// </summary>
/// <value>The addi conditions.</value>
[Description("附件查询条件"), Category("附加"), DefaultValue("")]
public string AddiConditions { get; set; } = "";
/// <summary>
/// 数据库名称
/// </summary>
/// <value>The name of the database.</value>
[Description("数据库名称"), Category("附加"), DefaultValue("wsprint")]
public string DatabaseName { get; set; } = "wsprint";
/// <summary>
/// 数据库用户名称
/// </summary>
/// <value>The uid.</value>
[Description("数据库用户名称"), Category("附加"), DefaultValue("sa")]
public string UID { get; set; } = "sa";
/// <summary>
/// 数据库用户密码.
/// </summary>
/// <value>The password.</value>
[Description("数据库用户密码"), Category("附加"), DefaultValue("sa")]
public string PWD { get; set; } = "sa";
/// <summary>
/// 数据库服务器名称或IP
/// </summary>
/// <value>The name of the serve.</value>
[Description("数据库服务器名称或IP"), Category("附加"), DefaultValue("xx-erpsvr")]
public string ServeName { get; set; } = "xx-erpsvr";

[Description("保留历史输入数量"), Category("附加"), DefaultValue(10)]
public int KeepHistorys { get; set; } = 10;

[Description("允许历史输入记录"), Category("附加"), DefaultValue(false)]
public bool EnabledHistory { get; set; } = false;
private System.Windows.Forms.ListBox ItemsListBox { get; set; } = new System.Windows.Forms.ListBox();
/// <summary>
/// 记录历史操作的用户名
/// </summary>
/// <value>The user identifier.</value>
[Description("记录历史操作的用户名"), Category("附加"), DefaultValue("")]
public string UserId { get; set; } = "";

System.Data.DataTable dt = new System.Data.DataTable(), dth = new System.Data.DataTable();
System.Data.SqlClient.SqlConnection conn;
System.Data.SqlClient.SqlCommand cmd;
public InputHistoryAndFilterTextBox()
{
}
public void Init()
{

ItemsListBox.Parent = this.Parent;
ItemsListBox.Top = this.Top + this.Height;
if (ItemsListBox.Top + ItemsListBox.Height > this.Parent.Height)
ItemsListBox.Top = this.Top - ItemsListBox.Height;
ItemsListBox.Left = this.Left;
ItemsListBox.Width = this.Width;
ItemsListBox.Visible = false;
ItemsListBox.BringToFront();

conn = new System.Data.SqlClient.SqlConnection("Data Source=" + ServeName + ";Initial Catalog=" + DatabaseName + ";Connect Timeout=30;UID = " + UID + ";PWD=" + PWD);
cmd = new System.Data.SqlClient.SqlCommand();
cmd.Connection = conn;
this.TextChanged += FilterTextBox_TextChanged;
this.LostFocus += FilterTextBox_LostFocus;
this.KeyDown += FilterTextBox_KeyDown;
Thread thread = new Thread(LoadData);
ItemsListBox.LostFocus += ItemsListBox_LostFocus;
ItemsListBox.MouseDoubleClick += ItemsListBox_MouseDoubleClick;
this.Validated += FilterTextBox_Validated;
this.GotFocus += FilterTextBox_GotFocus;
thread.Start();
}

private void FilterTextBox_GotFocus(object sender, EventArgs e)
{
if (dth.Rows.Count > 0 && this.Text.Trim() == "")
{
ItemsListBox.Items.Clear();
foreach (System.Data.DataRow row in dth.Rows)
{
ItemsListBox.Items.Add(row[0].ToString());
}

ItemsListBox.Visible = true;

}
}
private void FilterTextBox_Validated(object sender, EventArgs e)
{
if (this.Text.Trim().Length >= this.FindLength)
{
try
{
cmd.CommandText = string.Format("insert into UserInputHistory (ProductName,FormName,ControlName,UserID,InputText) values ('{0}','{1}','{2}','{3}','{4}')",
this.ProductName, this.FindForm().Name, this.Name, UserId, this.Text);
if (cmd.Connection.State == System.Data.ConnectionState.Closed) cmd.Connection.Open();
if(cmd.ExecuteNonQuery()>0)
{
Thread thread = new Thread(LoadInputData);
thread.Start();
}
}
catch
{
throw;
}
finally
{
cmd.Connection.Close();
}
}
}

private void ItemsListBox_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e)
{
if (ItemsListBox.SelectedItem != null)
{
this.Text = ItemsListBox.SelectedItem.ToString();
}
ItemsListBox.Visible = false;
this.Focus();
}

private void ItemsListBox_LostFocus(object sender, EventArgs e)
{
ItemsListBox.Visible = false;
}

private void FilterTextBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
switch (e.KeyCode)
{
case System.Windows.Forms.Keys.Up:
if (ItemsListBox.SelectedIndex > 0)
{
ItemsListBox.SelectedIndex -= 1;
}
break;
case System.Windows.Forms.Keys.Down:
if (ItemsListBox.SelectedIndex < ItemsListBox.Items.Count - 1)
ItemsListBox.SelectedIndex += 1;
break;
case System.Windows.Forms.Keys.Enter:
if (ItemsListBox.SelectedItem != null)
{
this.Text = ItemsListBox.SelectedItem.ToString();
}
ItemsListBox.Visible = false;
break;

}

}

private void FilterTextBox_LostFocus(object sender, EventArgs e)
{
if (!ItemsListBox.Focused)
ItemsListBox.Visible = false;
}

private void FilterTextBox_TextChanged(object sender, EventArgs e)
{
string text = this.Text.Trim();
if (text.Length >= FindLength)
{
ItemsListBox.Items.Clear();
foreach (var row in dt.Select(FieldName + " like '%" + text + "%'", FieldName))
{
ItemsListBox.Items.Add(row[0].ToString());
}
ItemsListBox.Visible = true;
}
else
{
ItemsListBox.Visible = false;
}
}

private void LoadData()
{
try
{
//载入筛选内容
cmd.CommandText = "select " + FieldName + " from " + TableName + (AddiConditions.Trim() == "" ? "" : " where ") + AddiConditions + " group by " + FieldName;
new System.Data.SqlClient.SqlDataAdapter(cmd).Fill(dt);

LoadInputData();
}
catch (Exception ex)
{
throw new Exception("使用前请先设置连接属性" + ex.Message);
}
}
private void LoadInputData()
{
try
{
//载入历史输入内容
cmd.CommandText = string.Format("select distinct TOP {4} InputText from UserInputHistory where ProductName = '{0}' and FormName = '{1}' and ControlName = '{2}' and UserID = '{3}' order by ID desc ", ProductName, FindForm().Name, Name, UserId, KeepHistorys);
new System.Data.SqlClient.SqlDataAdapter(cmd).Fill(dth);

}
catch (Exception ex)
{
throw new Exception("使用前请先设置连接属性" + ex.Message);
}

}
}
}

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Text;
using System.Threading;

namespace werp
{
    public class InputHistoryAndFilterTextBox : System.Windows.Forms.TextBox
    {

        /*
         * 实现功能:
         * 1.输入字符长度超过设定值后,筛选出包含输入内容的项目显示在控件下(上)面的列表框中
         * 2.获得焦点时在控件下(上)面的列表框中显示最近的输入内容(区分不同程序/不同窗体/不同控件/不同用户)
         * 未实现功能:清理超过一定数量的历史输入记录
            使用方法:
            1. 创建历史输入表
            CREATE TABLE [dbo].[UserInputHistory] (
                [ProductName] VARCHAR (255) NULL,
                [FormName]    VARCHAR (255) NULL,
                [ControlName] VARCHAR (255) NULL,
                [UserID]      VARCHAR (255) NULL,
                [InputText]   VARCHAR (255) NULL,
                [ID]          INT           IDENTITY (1, 1) NOT NULL, 
                CONSTRAINT [PK_UserInputHistory] PRIMARY KEY ([ID])
            );

            2.在设计时填写控件属性附加类别里的内容;
            3.在Form_Load里加入Init();
             */
        /// <summary>
        /// 查询的表名
        /// </summary>
        /// <value>The name of the table.</value>
        [Description("查询的表名"), Category("附加"), DefaultValue("t_item")]
        public string TableName { get; set; } = "t_item";
        /// <summary>
        /// 筛选的字段名
        /// </summary>
        /// <value>The name of the field.</value>
        [Description("筛选的字段名"), Category("附加"), DefaultValue("item_num")]
        public string FieldName { get; set; } = "item_num";
        /// <summary>
        /// 筛选起始长度
        /// </summary>
        /// <value>The length of the find.</value>
        [Description("筛选起始长度"), Category("附加"), DefaultValue(3)]
        public int FindLength { get; set; } = 3;
        /// <summary>
        /// 附件查询条件
        /// </summary>
        /// <value>The addi conditions.</value>
        [Description("附件查询条件"), Category("附加"), DefaultValue("")]
        public string AddiConditions { get; set; } = "";
        /// <summary>
        /// 数据库名称
        /// </summary>
        /// <value>The name of the database.</value>
        [Description("数据库名称"), Category("附加"), DefaultValue("wsprint")]
        public string DatabaseName { get; set; } = "wsprint";
        /// <summary>
        /// 数据库用户名称
        /// </summary>
        /// <value>The uid.</value>
        [Description("数据库用户名称"), Category("附加"), DefaultValue("sa")]
        public string UID { get; set; } = "sa";
        /// <summary>
        /// 数据库用户密码.
        /// </summary>
        /// <value>The password.</value>
        [Description("数据库用户密码"), Category("附加"), DefaultValue("sa")]
        public string PWD { get; set; } = "sa";
        /// <summary>
        /// 数据库服务器名称或IP
        /// </summary>
        /// <value>The name of the serve.</value>
        [Description("数据库服务器名称或IP"), Category("附加"), DefaultValue("xx-erpsvr")]
        public string ServeName { get; set; } = "xx-erpsvr";

        [Description("保留历史输入数量"), Category("附加"), DefaultValue(10)]
        public int KeepHistorys { get; set; } = 10;

        [Description("允许历史输入记录"), Category("附加"), DefaultValue(false)]
        public bool EnabledHistory { get; set; } = false;
        private System.Windows.Forms.ListBox ItemsListBox { get; set; } = new System.Windows.Forms.ListBox();
        /// <summary>
        /// 记录历史操作的用户名
        /// </summary>
        /// <value>The user identifier.</value>
        [Description("记录历史操作的用户名"), Category("附加"), DefaultValue("")]
        public string UserId { get; set; } = "";

        System.Data.DataTable dt = new System.Data.DataTable(), dth = new System.Data.DataTable();
        System.Data.SqlClient.SqlConnection conn;
        System.Data.SqlClient.SqlCommand cmd;
        public InputHistoryAndFilterTextBox()
        {
        }
        public void Init()
        {

            ItemsListBox.Parent = this.Parent;
            ItemsListBox.Top = this.Top + this.Height;
            if (ItemsListBox.Top + ItemsListBox.Height > this.Parent.Height)
                ItemsListBox.Top = this.Top - ItemsListBox.Height;
            ItemsListBox.Left = this.Left;
            ItemsListBox.Width = this.Width;
            ItemsListBox.Visible = false;
            ItemsListBox.BringToFront();

            conn = new System.Data.SqlClient.SqlConnection("Data Source=" + ServeName + ";Initial Catalog=" + DatabaseName + ";Connect Timeout=30;UID = " + UID + ";PWD=" + PWD);
            cmd = new System.Data.SqlClient.SqlCommand();
            cmd.Connection = conn;
            this.TextChanged += FilterTextBox_TextChanged;
            this.LostFocus += FilterTextBox_LostFocus;
            this.KeyDown += FilterTextBox_KeyDown;
            Thread thread = new Thread(LoadData);
            ItemsListBox.LostFocus += ItemsListBox_LostFocus;
            ItemsListBox.MouseDoubleClick += ItemsListBox_MouseDoubleClick;
            this.Validated += FilterTextBox_Validated;
            this.GotFocus += FilterTextBox_GotFocus;
            thread.Start();
        }

        private void FilterTextBox_GotFocus(object sender, EventArgs e)
        {
            if (dth.Rows.Count > 0 && this.Text.Trim() == "")
            {
                ItemsListBox.Items.Clear();
                foreach (System.Data.DataRow row in dth.Rows)
                {
                    ItemsListBox.Items.Add(row[0].ToString());
                }

                ItemsListBox.Visible = true;

            }
        }
        private void FilterTextBox_Validated(object sender, EventArgs e)
        {
            if (this.Text.Trim().Length >= this.FindLength)
            {
                try
                {
                    cmd.CommandText = string.Format("insert into UserInputHistory (ProductName,FormName,ControlName,UserID,InputText) values ('{0}','{1}','{2}','{3}','{4}')",
                        this.ProductName, this.FindForm().Name, this.Name, UserId, this.Text);
                    if (cmd.Connection.State == System.Data.ConnectionState.Closed) cmd.Connection.Open();
                    if(cmd.ExecuteNonQuery()>0)
                    {
                        Thread thread = new Thread(LoadInputData);
                        thread.Start();
                    }
                }
                catch
                {
                    throw;
                }
                finally
                {
                    cmd.Connection.Close();
                }
            }
        }

        private void ItemsListBox_MouseDoubleClick(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (ItemsListBox.SelectedItem != null)
            {
                this.Text = ItemsListBox.SelectedItem.ToString();
            }
            ItemsListBox.Visible = false;
            this.Focus();
        }

        private void ItemsListBox_LostFocus(object sender, EventArgs e)
        {
            ItemsListBox.Visible = false;
        }

        private void FilterTextBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {
            switch (e.KeyCode)
            {
                case System.Windows.Forms.Keys.Up:
                    if (ItemsListBox.SelectedIndex > 0)
                    {
                        ItemsListBox.SelectedIndex -= 1;
                    }
                    break;
                case System.Windows.Forms.Keys.Down:
                    if (ItemsListBox.SelectedIndex < ItemsListBox.Items.Count - 1)
                        ItemsListBox.SelectedIndex += 1;
                    break;
                case System.Windows.Forms.Keys.Enter:
                    if (ItemsListBox.SelectedItem != null)
                    {
                        this.Text = ItemsListBox.SelectedItem.ToString();
                    }
                    ItemsListBox.Visible = false;
                    break;

            }

        }

        private void FilterTextBox_LostFocus(object sender, EventArgs e)
        {
            if (!ItemsListBox.Focused)
                ItemsListBox.Visible = false;
        }

        private void FilterTextBox_TextChanged(object sender, EventArgs e)
        {
            string text = this.Text.Trim();
            if (text.Length >= FindLength)
            {
                ItemsListBox.Items.Clear();
                foreach (var row in dt.Select(FieldName + " like '%" + text + "%'", FieldName))
                {
                    ItemsListBox.Items.Add(row[0].ToString());
                }
                ItemsListBox.Visible = true;
            }
            else
            {
                ItemsListBox.Visible = false;
            }
        }

        private void LoadData()
        {
            try
            {
                //载入筛选内容
                cmd.CommandText = "select " + FieldName + " from " + TableName + (AddiConditions.Trim() == "" ? "" : " where ") + AddiConditions + " group by " + FieldName;
                new System.Data.SqlClient.SqlDataAdapter(cmd).Fill(dt);

                LoadInputData();
            }
            catch (Exception ex)
            {
                throw new Exception("使用前请先设置连接属性" + ex.Message);
            }
        }
        private void LoadInputData()
        {
            try
            {
                //载入历史输入内容
                cmd.CommandText = string.Format("select distinct TOP {4} InputText from UserInputHistory where ProductName = '{0}' and FormName = '{1}' and ControlName = '{2}' and UserID = '{3}' order by ID desc ", ProductName, FindForm().Name, Name, UserId, KeepHistorys);
                new System.Data.SqlClient.SqlDataAdapter(cmd).Fill(dth);

            }
            catch (Exception ex)
            {
                throw new Exception("使用前请先设置连接属性" + ex.Message);
            }

        }
    }
}

 

友情提示:
信息收集于互联网,如果您发现错误或造成侵权,请及时通知本站更正或删除,具体联系方式见页面底部联系我们,谢谢。

其他相似内容:

热门推荐: