C#TextBox自动完成

本文介绍了一种通过使用ComboBox替代AutoCompleteStringCollection来提高AutoComplete性能的方法,并详细展示了前后台代码及数据库查询的具体实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

AutoCompleteStringCollection acs = new AutoCompleteStringCollection();

private void Frm_CropEdit_Load(object sender, EventArgs e)
        {
                bindAcs();
         }

        private void bindAcs()
        {
            acs.Clear();
            DataTable dt = hp.GetDouQuByChannelCode(Frm_MakePlan.wps.MainChannelID, "tree");
            foreach (DataRow dr in dt.Rows)
            {
                acs.Add(dr["CANALNAME"].ToString());
            }
            this.txtChannelName.AutoCompleteMode = AutoCompleteMode.Suggest;
            this.txtChannelName.AutoCompleteSource = AutoCompleteSource.CustomSource;
            this.txtChannelName.AutoCompleteCustomSource = acs;
        }

上面问题的弊端:

1.textbox 框抖动很厉害,加了皮肤的应用程序会更加厉害

2.光标丢失

3. 内存消耗程序报错

 

可以的解决办法:

页面布局:放置combox在textbox框的后面,让textbox框遮盖combox的输入区域

前台代码:

private void txtChannelName_TextChanged(object sender, EventArgs e)
        {
            if (this.txtChannelName.Text.Trim().Length < 1)
                return;
            if (isopened)
            {
                isopened = false;
                return;
            }
            DataTable dt = hp.GetDouQuAuto(Frm_MakePlan.wps.MainChannelID,this.txtChannelName.Text.Trim());
            this.comboBox1.Items.Clear();
            foreach (DataRow dr in dt.Rows)
            { this.comboBox1.Items.Add(dr["CANALNAME"].ToString());             
            }
            this.comboBox1.DroppedDown = true;          
            this.comboBox1.Cursor = Cursors.Hand;
          
        }

        private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
        {
            if (this.comboBox1.Items.Count == 0)
                return;          
            if (this.comboBox1.SelectedItem == null)
                return;
            this.comboBox1.DroppedDown = false;
            isopened = true;
            this.txtChannelName.Text = this.comboBox1.SelectedItem.ToString();
          
        }

        //private void txtChannelName_KeyDown(object sender, KeyEventArgs e)
        //{
        //    if (e.KeyCode == Keys.Down)
        //    {              
        //        this.comboBox1.DroppedDown=true;
        //        this.comboBox1.Focus();
        //        //this.comboBox1.SelectedIndex = 0;
        //    }
        //}
数据层:

public DataTable GetDouQuAuto(string channelCode, string blur)
       {
           IDataParameter[] paras = new SqlParameter[]
           {
               new SqlParameter("@canalcode",channelCode),
               new SqlParameter("@blur",blur)             
           };
           DataSet ds = new DataSet();
           RunProcedure("pr_UW_GetCancelAutoComplete", paras, ds, "dataSetTemp1");
           return ds.Tables["dataSetTemp1"];
       }

Sql代码处理:

EXEC pr_UW_GetCancelAutoComplete 'CA201004090001','2'

CREATE PROC pr_UW_GetCancelAutoComplete
(
@canalcode varchar(14),
@blur varchar(50)
)
AS

WITH temcan
AS
(
SELECT can.CANALCODE,can.CANALNAME,can.CANALORGTYPE FROM [T02_CANAL] can
WHERE can.[CANALCODE]=@canalcode AND can.CANALORGTYPE=1 AND can.STATUS='1'
UNION ALL
SELECT can2.CANALCODE,can2.CANALNAME,can2.CANALORGTYPE FROM [T02_CANAL] can2
INNER JOIN temcan can1 ON can2.[PARCANALCODE]=can1.[CANALCODE]
WHERE (can2.CANALORGTYPE=2 OR can2.CANALORGTYPE=3)
AND can2.STATUS='1'
)
SELECT * FROM [temcan] WHERE CANALORGTYPE=3
AND CANALNAME LIKE '%'+@blur+'%'

转载于:https://www.cnblogs.com/sanpi/archive/2010/08/13/1798726.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值