代码改变世界

C#TextBox自动完成

2010-08-13 09:53  三皮开发时  阅读(1841)  评论(1编辑  收藏  举报

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+'%'