最近工作涉及到一些Window Form Combobox 下拉控件的使用,如怎么能使用我的下拉框有查询功能,查询出的来的数据集数据太多怎么能用树形的结构显示,让使用者看起来结构清晰,还想有象treeview控件一样鼠标停在某一项就可以显示某一项的文本提示等一些功能,这些功能看起来相对简单,有时候不知道怎么做的时候,也需要发一点时间在上面的,这一段时间实现了这些基本功能,总结下来以免以后忘记。
第一、 控件的查询功能
1. 数据加载这里不能直接绑定数据库,只能一项一项的绑定到控件才能实现)
2. 数据的提取
DataTable projectTable = new DataTable();
projectTable = 根据SQL查询全部的数据信息
3. 要实现Combobox的查询功能首先在控件的KeyPress事件里处理一下输入的信息
/// <summary>
/// 根据下拉框输入的内容查询
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void combobox1_KeyPress(object sender, KeyPressEventArgs e)
{
string strFindStr = this.combobox1.Text.Trim();
//展开下拉框
combobox1.DroppedDown = true;
if (e.KeyChar == (char)8)
{
if (combobox1.SelectionStart <= 1)
{
combobox1.Text = "";
return;
}
if (combobox1.SelectionLength == 0)
strFindStr = combobox1.Text.Substring(0, combobox1.Text.Length - 1);
else
strFindStr = combobox1.Text.Substring(0, combobox1.SelectionStart - 1);
}
else
{
if (cb.SelectionLength == 0)
strFindStr = combobox1.Text + e.KeyChar;
else
strFindStr = combobox1.Text.Substring(0, combobox1.SelectionStart) + e.KeyChar;
}
//加载数据
int count = LoadComboboxItemLayer(strFindStr);
// 查询下拉列表中的数据项目如果有匹配,自动加匹配全部字符串.
int intIdx = -1;
intIdx = combobox1.FindString(strFindStr);
if (intIdx != -1)
{
combobox1.SelectedText = "";
if (count == 1)
{
combobox1.SelectedIndex = intIdx;
combobox1.SelectionStart = strFindStr.Length;
combobox1.SelectionLength = combobox1.Text.Length;
}
else
{
combobox1.SelectedIndex = 0;
combobox1.SelectionStart = strFindStr.Length;
combobox1.SelectionLength = combobox1.Text.Length;
}
e.Handled = true;
}
else
{
e.Handled = false;
}
}
/// <summary>
/// 根据输入内容加载数据
/// </summary>
/// <param name="queryStr">Combobox控件输入的内容</param>
private int LoadComboboxItemLayer(string queryStr)
{
this.combobox1.Items.Clear();
int result = 0;
//加载数据
if (projectTable!= null && projectTable.Rows.Count > 0)
{
string beforPorvince = string.Empty;
DictionaryItem pLineItem;
DataRow[] rows;
DataRow[] projectDataRows = projectTable.Select(" pName like '%" + queryStr + "%' or cName like '%" + queryStr + "%' ", " pCode ");
foreach (DataRow provinceRow in projectDataRows)
{
if (beforPorvince != provinceRow["pCode"].ToString())
{
//添加树开结构的第一级信息
pLineItem = new DictionaryItem();
pLineItem.Code = provinceRow["pCode"].ToString();
pLineItem.Value = provinceRow["pName"].ToString();
cmbLine.Items.Add(pLineItem);
//根据第一级显示的父级查询的子级
rows = projectTable.Select("pCode = '" + provinceRow["pCode "].ToString() + "' and (pName like '%" + queryStr + "%' or cName like '%" + queryStr + "%')");
foreach (DataRow porjectRow in rows)
{
pLineItem = new DictionaryItem();
pLineItem.Code = provinceRow["cCode"].ToString();
pLineItem.Value = " " + provinceRow["cName"].ToString();
cmbLine.Items.Add(pLineItem);
result++;
}
}
beforPorvince = provinceRow["pCode"].ToString();
}
}
return result;
}
第二、 Combobox 控件下拉的树形显示
在第一部分中的代码已经实现的树开显示,不知道有木有注意到就是这一段代码
public class DictionaryItem
{
public string Code = "";
public string Value = "";
}
foreach (DataRow porjectRow in rows)
{
pLineItem = new DictionaryItem();
pLineItem.Code = provinceRow["cCode"].ToString();
pLineItem.Value = " " + provinceRow["cName"].ToString();//这一部分
cmbLine.Items.Add(pLineItem);
result++;
}
其实很简单,就是在添加控件的每一数据项时,在显示文本的时候前面加一段空字符串,就可以实现,简单吧,这一段代码是树中要显示的第二级的内容,还有第三级等,自己发挥,你明白的。取选择的每一项:
DictionaryItem dicItem = 控件.SelectedItem as DictionaryItem;
dicItem.Code 和 dicItem.Value 就可以得到你选择的值
第三、 Combobox控件下拉内容的Tooltip提示
实现也比较简单,控件的一个属性的值和三个事件还有一个Tooltip控件,首先在Form里添加一个Tooltip控件,命名为toolTipCmblin,再把Combobox控件的属性DrawMode设置为OwnerDrawFixed,然后添加控件的三个事件:DrawItem,DropDown和DropDownClosed,代码如下:
/// <summary>
/// 鼠标停在某一项目时提示显示全部的内容
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void combobox1_DrawItem(object sender, DrawItemEventArgs e)
{
string text = this.combobox1.GetItemText(combobox1.Items[e.Index]);
e.DrawBackground();
using (SolidBrush br = new SolidBrush(e.ForeColor))
{
e.Graphics.DrawString(text, e.Font, br, e.Bounds);
}
if ((e.State & DrawItemState.Selected) == DrawItemState.Selected)
{
this.toolTipCmblin.Show(text, combobox1, e.Bounds.Right, e.Bounds.Bottom);
}
else
{
this.toolTipCmblin.Hide(combobox1);
}
e.DrawFocusRectangle();
}
/// <summary>
/// 启用下拉提示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void combobox1_DropDown(object sender, EventArgs e)
{
this.toolTipCmblin.Active = true;
}
/// <summary>
/// 关闭下拉提示
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void combobox1_DropDownClosed(object sender, EventArgs e)
{
this.toolTipCmblin.Active = false;
}
到些为止,大功告成!