当前位置:文档之家› ComboBox列表智能自动下拉

ComboBox列表智能自动下拉

ComboBox列表智能自动下拉

实际操作步骤和思路如下:

1、在text_changed里触发

2、在比对后要进行加载将要显示相关数据(如动态数据绑定等),向下拉列表添加内容: comboBox1.Items.Add(str); 使用此语句可以添加str到下拉列表中

3、最后,设置 comboBox1.DroppedDown = true; 可以显示下拉列表的内容。

A、需要对comboBox进行设置的属性有:comboBox1.AutoCompleteMode=System.Windows.Forms.AutoCompleteMode.Suggest;

另外 comboBox1.AutoCompleteSource和comboBox1.AutoCompleteCustomSource可以根据具体的应用进行相关设置。

B、不足和改进: text中的光标会自动跑到最左端,这样会造成老在最左端输入数据,这样对人是非常不习惯的。所以必须把光标自动移到最右端。改进的办法是利用SelectionStart属性(获取或设置组合框中选定文本的起始索引),来进行移到光标。

int len_cmb = 0;

len_cmb = cmb_UName.Text.Length;

cmb_UName.SelectionStart = len_cmb;

C、对于操作的方便性,可以考虑 comboBox_KeyDown事件,对回车键进行触发


private void cmb_UName_KeyDown(object sender, KeyEventArgs e)

{

if (e.KeyCode == Keys.Enter)

{

………

}

}


本文来自CSDN博客,转载请标明出处:https://www.doczj.com/doc/4118304626.html,/feiji323/archive/2010/06/24/5690563.aspx





**********************************************************************************************

ComBoBox 自动筛选,自动调整下拉宽度

这个写的比较简单还没做封装 指定combobox的数据源为必须datatable .有兴趣的可以做参考,重新封装.


using System;
using System.Collections.Generic;
using https://www.doczj.com/doc/4118304626.html,ponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace WindowsApplication1
{
public partial class Form1 : Form
{
// 构造函数
public Form1()
{
InitializeComponent();
// 构造数据
loaddata();
}
// 构造数据源
private DataTable mdataSource = new DataTable();

// 初始化数据
///


/// 构造数据
///

private void loaddata()
{
DataTable dt = new DataTable();
dt.Columns.Add("name", typeof(string));
dt.Columns.Add("value", typeof(string));
DataRow dr0 = dt.NewRow();
dr0["name"] = string.Empty;
dr0["value"] = "0";
dt.Rows.Add(dr0);
DataRow dr1 = dt.NewRow();
dr1["name"] = "a";
dr1["value"] = "1";
dt.Rows.Add(dr1);
DataRow dr2 = dt.NewRow();
dr2["name"] = "ab";
dr2["value"] = "2";
dt.Rows.Add(dr2);
Data

Row dr3= dt.NewRow();
dr3["name"] = "abc";
dr3["value"] = "3";
dt.Rows.Add(dr3);

DataRow dr4= dt.NewRow();
dr4["name"] = "time";
dr4["value"] = "4";
dt.Rows.Add(dr4);

DataRow dr5 = dt.NewRow();
dr5["name"] = "this is a max length string to test if the dropdownwith is autochange";
dr5["value"] = "5";
dt.Rows.Add(dr5);
DataRow dr6 = dt.NewRow();
dr6["name"] = "date";
dr6["value"] = "6";
dt.Rows.Add(dr6);
DataRow dr7= dt.NewRow();
dr7["name"] = "time and date";
dr7["value"] = "7";
dt.Rows.Add(dr7);
dt.AcceptChanges();
mdataSource = dt;
BindDate(mdataSource);
}
private void BindDate(DataTable dt)
{
https://www.doczj.com/doc/4118304626.html,boBox1.DataSource = dt;
https://www.doczj.com/doc/4118304626.html,boBox1.DisplayMember = "name";
https://www.doczj.com/doc/4118304626.html,boBox1.ValueMember = "value";
// 自带调整下拉框
AutoSizeComboBoxItem(https://www.doczj.com/doc/4118304626.html,boBox1);
comboBox1.SuspendLayout();
}
private DataTable dtfliter = new DataTable();
// 特殊出标志
private bool flag = false;
///


/// combobox 输入事件
///

///
///
private void comboBox1_KeyUp(object sender, KeyEventArgs e)
{
if (https://www.doczj.com/doc/4118304626.html,boBox1.Text == string.Empty)
{
BindDate(mdataSource);
https://www.doczj.com/doc/4118304626.html,boBox1.Text = string.Empty;
return;
}
flag = false;
string str = https://www.doczj.com/doc/4118304626.html,boBox1.Text;
// 根据输入的值自带筛选
bool validate = Fillter(str);

// 现实下拉框
https://www.doczj.com/doc/4118304626.html,boBox1.DroppedDown = true;
// 输入无效的数据
if (!validate)
{
MessageBox.Show("输入的数据无效,请重新输入");
}
else
{
https://www.doczj.com/doc/4118304626.html,boBox1.Text = str;
if (comboBox1.Text != null && comboBox1.Text != string.Empty)
{
// 获得光标位置
https://www.doczj.com/doc/4118304626.html,boBox1.SelectionStart = comboBox1.Text.Length;
}
}

// 现实鼠标
https://www.doczj.com/doc/4118304626.html,boBox1.Cursor = Cursors.Default;

}
///
/// 筛选匹配的值
///

///
private bool Fillter(string str)
{
bool isvalida = true;
DataTable dt = mdataSource.Clone();

// 循环筛选匹配的值
foreach (DataRow dr in mdataSource.Rows)
{
int i = -1;
i = dr["name"].ToString().IndexOf(str.ToString());
if (i > -1)
{
DataRow newrow = dt.NewRow();
newrow.ItemArray = dr.ItemArray;
// 构造新的数据
dt.Rows.Add(newrow);
}

}
dt.AcceptChanges();
BindDate(dt);
//if (flag && dt.Rows.Count > 1)
//{
// https://www.doczj.com/doc/4118304626.html,boBox1.Text = str;
// return;
//}
// 当为一条数据要特殊处理/不然光标返回有问题
if (dt.Rows.Count == 1)
{
// 特殊处理标志
flag = true;
https://www.doczj.com/doc/4118304626.html,boBox1.Text = str;// str参数为输入的值;
int len = str.Length;
// Fillter(str.Substring(0, len - 1));
}
// 当数据源中没有输入的值提示, 并且截断字符重新筛选
if (dt.Rows.Count == 0)
{
if (str.Length > 0)
{
int i = str.Length - 1;
Fillter(str.Substring(0, i));
isvalida = false;
}

}
return isvalida;
}

///


/// 自动调整宽度
///

///
public void AutoSizeComboBoxItem(object sender)
{
Graphics g = null; Font font = null;
try
{
ComboBox senderComboBox = sender as ComboBox;

int width = senderComboBox.Width;
g = senderComboBox.CreateGraphics();
font = senderComboBox.Font;

//checks if a scrollbar will be displayed.
//If yes, then get its width to adjust the size of the drop down list.
int vertScrollBarWidth =
(senderComboBox.Items.Count > senderComboBox.MaxDropDownItems)
? SystemInformation.VerticalScrollBarWidth : 0;

int newWidth;
// 取得数据源
DataTable dt = (DataTable)senderComboBox.DataSource;
foreach (DataRow s in dt.Rows) //Loop through list items and check size of each items.
{
if (s != null)
{
newWidth = (int)g.MeasureString(s["name"].ToString().Trim(), font).Width
+ vertScrollBarWidth;
if (width < newWidth)
width = newWidth; //set the width of the drop down list to the width of the larg

est item.
}
}
https://www.doczj.com/doc/4118304626.html,boBox1.DropDownWidth = width;
}
catch
{ }
finally
{
if (g != null)
g.Dispose();
}

}
///


/// 下拉事件
///

///
///
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
AutoSizeComboBoxItem(https://www.doczj.com/doc/4118304626.html,boBox1);
}

}
}



相关主题
文本预览
相关文档 最新文档