DevExpress资料不多,用起来又很麻烦,今天搞一个下拉框,要求能支持拼音下拉,
试了不少方法,比如说组合控件啊,CombEdit, lookupedit ,虽然能达到效果,但是功能很不满意,感觉卡卡的,性能也不完美。
最后花了好几个小时才终于最好,这里总结一下:
1:果断改用 GridLookUpEdit
2:拖入控件以后,直接敲代码:
/// <summary>
/// 加载数据
/// </summary>
public new void LoadData()
{
//获取所有站点 这个方法是我自己的绑定数据源的集合,你们不用管
Sites = _lineCompilationService.SelectTrainStationYards();
if (Sites.Any())
{
//设置修改时会立即展开下拉框
this.gridLookUpEdit1.Properties.ImmediatePopup = true;
//this.gridLookUpEdit1.Properties.PopupFilterMode = PopupFilterMode.Contains;
//设置可以编辑
this.gridLookUpEdit1.Properties.TextEditStyle = TextEditStyles.Standard;
//指定绑定的 DataSource Sites是一个list集合,当然你也绑定dataTable,原理是一样的,绑定model下面就输入属性名,datatable就列名
this.gridLookUpEdit1.Properties.DataSource = Sites;
//ValueMember可为空
// this.gridLookUpEdit1.Properties.ValueMember = "StationyardCode";
//选中以后显示的值
this.gridLookUpEdit1.Properties.DisplayMember = "StationyardName";
//绑定下拉框事件
this.gridLookUpEdit1.Properties.Popup += new EventHandler(gridLookUpEdit1_Popup);
//绑定值改变事件
this.gridLookUpEdit1.EditValueChanging += new ChangingEventHandler(gridLEdit1_EditValueChanging);
//绑定文本改变事件
this.gridLookUpEdit1.TextChanged += new EventHandler(gridLUpEdit1_TextChanged);
//为空的时候显示的内容
this.gridLookUpEdit1.Properties.NullText = "";
}
}
private void gridLookUpEdit1_Popup(object sender, EventArgs e)
{
FilterLookup(sender, new string[] { "StationyardName", "StationyardNamePinYinFull", "StationyardNamePinYinSimple" });//中文,全拼英,简拼
}
private void gridLUpEdit1_TextChanged(object sender, EventArgs e)
{
GridLookUpEdit edit = sender as GridLookUpEdit;
edit.SelectionStart = edit.Text.Length;
}
private void gridLEdit1_EditValueChanging(object sender, ChangingEventArgs e)
{
this.BeginInvoke(new System.Windows.Forms.MethodInvoker(delegate
{
FilterLookup(sender, new string[] { "StationyardName", "StationyardNamePinYinFull", "StationyardNamePinYinSimple" });
}));
}
/// <summary>
/// 拼英模糊查询的关键方法
/// </summary>
/// <param name="sender"></param>
/// <param name="arrFilterField"></param>
private void FilterLookup(object sender, string[] arrFilterField)
{
GridLookUpEdit edit = sender as GridLookUpEdit;
GridView gridView = edit.Properties.View as GridView;
FieldInfo fi = gridView.GetType().GetField("extraFilter", BindingFlags.NonPublic | BindingFlags.Instance);
CriteriaOperator[] arrCriteriaOperator = new CriteriaOperator[arrFilterField.Length];
for (int i = 0; i < arrFilterField.Length; i++)
{
arrCriteriaOperator[i] = new BinaryOperator(arrFilterField[i], "%" + edit.AutoSearchText + "%", BinaryOperatorType.Like);
}
string filterCondition = new GroupOperator(GroupOperatorType.Or, arrCriteriaOperator).ToString();
fi.SetValue(gridView, filterCondition);
MethodInfo mi = gridView.GetType().GetMethod("ApplyColumnsFilterEx", BindingFlags.NonPublic | BindingFlags.Instance);
mi.Invoke(gridView, null);
}
好了,模糊多字段查询就好了,最后你可能不需要显示这么多列,那怎么办呢?
这里简单说下,不给图了: 一点基础都没有的我只能 say sorry
1:在视图中找到控件
2:找到控件的小图标,左键点击展开
3:选择“Design View ” 展开Dev控件的专门属性
4: 左边的大分组,选择 “columns”
5:右边开是 选择加号 ,“add columens”
6:把你要显示出来的列加进去,其中 ,每个列的:caption 是列头 ,FileldName是绑定的字段名 ;
另外,你运行了以后,发现样式并不像一个下拉框,怎么办?
1:
隐藏grid的表头
在Views里面的,OptionsView里面的ShowColumnHeadeas 改成 false 则不显示了标题了。
2:
隐藏gird标识列
Custom Draw Row Indicator
在Views里面的,OptionsView里面的showIndicator 改成 false 则不显示标识列了
3:隐藏grid的跨行边框(水平网络格)
在Views里面的,OptionsView里面的ShowHorizontalLines 改成 false 则不显示标识列了
注意:ShowHorizontalLines默认值是default ,貌似有bug,你改成false没效果,你需要先改成true,运行一次,再改成false就号了
4:设置宽度
在控件的属性面板中,Properties ->PopupFormSize 设置 width 和 Height
其中有个最小宽度和高度,Properties ->PopupMinFormSize 设置 width 和 Height
好了最后看效果,很满意
设置完就结束了,祝大家好运,不懂可以加我QQ 10200454