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