自带模糊查询的COMBOX
先定义一个组件,集成自Combox:
/// <summary>
/// 自带模糊查询的COMBOX
/// </summary>
public partial class ComboxEX : ComboBox
{
/// <summary>
/// 自带模糊查询的COMBOX
/// </summary>
public ComboxEX()
{
InitializeComponent();
}
public DataTable DtBase { get; set; }
public List<string> LstSearchFields;
public ComboxEX(IContainer container)
{
container.Add(this);
InitializeComponent();
}
/// <summary>
/// 绑定数据
/// </summary>
/// <param name="tb">数据</param>
/// <param name="disName">显示列</param>
/// <param name="vlName">值列</param>
/// <param name="searchFields">模糊查询匹配的列集合</param>
public void BindData(DataTable tb,string disName,string vlName,List<string> searchFields)
{
this.LstSearchFields = searchFields;
this.DisplayMember=disName;
this.ValueMember=vlName;
this.DtBase = tb;
this.DataSource = tb;
}
protected override void OnTextUpdate(EventArgs e)
{
DataTable dt = this.DtBase.Clone();
var txt = this.Text.Trim();
if (string.IsNullOrEmpty(txt))
{
//清空了条件
dt = this.DtBase.Copy();
}
else
{
string fl = "";
foreach(string s in this.LstSearchFields)
{
fl += (fl==""?"":" or ") +s + " like '%"+ this.Text.Trim().ToUpper() + "%' ";
}
this.DtBase.DefaultView.RowFilter = fl;
dt = this.DtBase.DefaultView.ToTable();
}
this.DataSource = dt;
this.DroppedDown = true;
this.Text = txt;
this.SelectionLength = 0;
//设置光标位置,否则光标位置始终保持在第一列,造成输入关键词的倒序排列
this.SelectionStart = this.Text.Length;
}
}
调用,可以直接从工具栏,拉到界面上;
调用先初始化数据:
private void BingComboxEx()
{
DataTable tb = new DataTable();
tb.Columns.Add("CODE", typeof(string));
tb.Columns.Add("NAME", typeof(string));
tb.Columns.Add("PYM", typeof(string));
tb.Columns.Add("MEMO", typeof(string));
tb.Rows.Add(new object[] {"S001","螺丝","LS","A" });
tb.Rows.Add(new object[] { "S002", "大螺丝", "DLS", "A" });
tb.Rows.Add(new object[] { "S003", "小螺丝", "XLS", "B" });
tb.Rows.Add(new object[] { "D004", "中螺丝", "ZLS", "B" });
tb.Rows.Add(new object[] { "D005", "大螺母", "DLM", "C" });
tb.Rows.Add(new object[] { "D006", "小螺母", "XLM", "C" });
//初始化数据 ,显示字段、值字段、模糊查询匹配的字段集合
this.comboxEX1.BindData(tb, "NAME", "CODE", new List<string>() { "NAME", "CODE", "PYM", "MEMO" });
}
效果图: