基础版
作为SearchLookUpEdit最简单的用法,就是单选了。操作方案如下:
1.拖拽一个SearchLookUpEdit到界面上。修改Name为slue_selItemsId。
2.点开文本框右上三角,Design View设计,添加显示字段。
3.赋值如下:
listAllItems = CommonVar.g_AdviceItems.Clone();
listAllItems = listAllItems.GroupBy(q => new { q.DrugCode, q.DrugName,q.PyCode,q.WbCode }).Select(q => new ViewDrug { DrugCode = q.Key.DrugCode, DrugName = q.Key.DrugName,PyCode=q.Key.PyCode,WbCode=q.Key.WbCode }).ToList();
this.slue_selItemsId.Properties.DataSource = listAllItems;
this.slue_selItemsId.Properties.DisplayMember = "DrugName";
this.slue_selItemsId.Properties.ValueMember = "DrugCode";
即可实现效果,界面如下
点击文本框或者下拉,即可出现筛选框和筛选内容。
在筛选框里输入每一列的内容点击搜索皆可筛选(这个挺方便,但是列隐藏后不能筛选,例如想隐藏拼音码或五笔码筛选不了)
单击筛选行,可直接选中,将绑定的Text值显示到文本框,选中后弹出框自动关闭,通过EditValue得到选中的Value值。
清除为清除文本框选中的值。
左下角的“x”为关闭弹出框
PS:效果测试还行,满足单选筛选。但是这简单的功能GridLookUpEdit完全可以胜任了,而且界面更好看,不需要弹出框再筛选这么赘余的东西。所以单选不推荐用这个控件。以下是GridLookUpEdit的界面。
高级版
以上知,单选版完全没必要使用SearchLookUpEdit,所以它的价值在多选上,这是其他Dev控件无法胜任的功能。
总体效果如下:
使用步骤:
1.拖拽一个SearchLookUpEdit到界面上。修改Name为slue_selItemsId。
2.点开文本框右上三角,Design View设计,添加显示字段。
View中设置:
3.赋值如下
listAllItems = CommonVar.g_AdviceItems.Clone();
listAllItems = listAllItems.GroupBy(q => new { q.DrugCode, q.DrugName,q.PyCode }).Select(q => new ViewDrug { DrugCode = q.Key.DrugCode, DrugName = q.Key.DrugName,PyCode=q.Key.PyCode }).ToList();
// 多选下拉筛选框的数据源是listAllItems,之后通过IsPicking属性判断是否选中
this.slue_selItemsId.Properties.DataSource = listAllItems;
this.slue_selItemsId.Properties.DisplayMember = "DrugName";
this.slue_selItemsId.Properties.ValueMember = "DrugCode";
4.事件
//选择项目时,动态显示选中个数
public LabelControl searchResult = new LabelControl() { Text = "已选择 0 个项目。" };
/// <summary>
/// 多选筛选下拉框点Ok才存的Code
/// </summary>
private List<string> listSelDrugCode = new List<string>();
#region 项目筛选框相关
// 弹出窗体,并动态添加控件(确认按钮,取消按钮,选中结果显示标签)
// 窗体弹出事件
private void slue_selItemsId_Properties_Popup(object sender, EventArgs e)
{
//得到当前SearchLookUpEdit弹出窗体
PopupSearchLookUpEditForm form = (sender as IPopupControl).PopupWindow as PopupSearchLookUpEditForm;
SearchEditLookUpPopup popup = form.Controls.OfType<SearchEditLookUpPopup>().FirstOrDefault();
LayoutControl layout = popup.Controls.OfType<LayoutControl>().FirstOrDefault();
//如果窗体内空间没有确认按钮,则自定义确认simplebutton,取消simplebutton,选中结果label
if (layout.Controls.OfType<Control>().Where(ct => ct.Name == "btOK").FirstOrDefault() == null)
{
//得到空的空间
EmptySpaceItem a = layout.Items.Where(it => it.TypeName == "EmptySpaceItem").FirstOrDefault() as EmptySpaceItem;
//得到取消按钮的容器
Control clearBtn = layout.Controls.OfType<Control>().Where(ct => ct.Name == "btClear").FirstOrDefault();
LayoutControlItem clearLCI = (LayoutControlItem)layout.GetItemByControl(clearBtn);
clearBtn.Click += clearBtn_Click;//重写的清除
//添加一个simplebutton控件(确认按钮)
LayoutControlItem myLCI = (LayoutControlItem)clearLCI.Owner.CreateLayoutItem(clearLCI.Parent);
myLCI.TextVisible = false;
SimpleButton btOK = new SimpleButton() { Name = "btOK", Text = "确定" };
btOK.Click += btOK_Click;
myLCI.Control = btOK;
myLCI.SizeConstraintsType = SizeConstraintsType.Custom;//控件的大小设置为自定义
myLCI.MaxSize = clearLCI.MaxSize;
myLCI.MinSize = clearLCI.MinSize;
myLCI.Move(clearLCI, DevExpress.XtraLayout.Utils.InsertType.Left);
//添加一个label控件(选中结果显示)
LayoutControlItem msgLCI = (LayoutControlItem)clearLCI.Owner.CreateLayoutItem(a.Parent);
msgLCI.TextVisible = false;
msgLCI.Control = searchResult;
msgLCI.Move(a, DevExpress.XtraLayout.Utils.InsertType.Left);
msgLCI.BestFitWeight = 100;
}
}
/// <summary>
/// 确定
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void btOK_Click(object sender, EventArgs e)
{
// 只有在点击确定按钮,才把勾选的临时值赋值给确定值listSelDrugCode
listSelDrugCode = listAllItems.Where(q => q.IsPicking).Select(q => q.DrugCode).ToList();
// 关闭方法会自动调用slue_selItemsId_Closed事件
slue_selItemsId.ClosePopup();
// 确定后筛选数据
GirdViewFiler();
}
/// <summary>
/// 重写的清除
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void clearBtn_Click(object sender, EventArgs e)
{
// 清空确定值
listSelDrugCode.Clear();
// 调用关闭事件根据listSelDrugCode值,初始化多选下拉框
slue_selItemsId_Closed(null, null);// 本应该先走清除按钮事件再走关闭事件的,可是不知道为啥竟然颠倒了,所以这里要手动调用关闭事件去初始化下拉框
// 筛选数据
GirdViewFiler();
}
/// <summary>
/// 关闭
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void slue_selItemsId_Closed(object sender, DevExpress.XtraEditors.Controls.ClosedEventArgs e)
{
// 关闭后使下拉数据源控件数据源,选中状态,选中值和tip标签还原上次的保存的结果
listAllItems.ForEach(q => q.IsPicking = listSelDrugCode.Contains(q.DrugCode));
slue_selItemsId.ToolTip = string.Join(",", listAllItems.Where(q => q.IsPicking).Select(q => q.DrugName).ToList());
slue_selItemsId.EditValue = string.Join(",", listAllItems.Where(q => q.IsPicking).Select(q => q.DrugName).ToList());
searchResult.Text = $"已选择 {listAllItems.Count(q => q.IsPicking)} 项目。";
}
/// <summary>
/// 项目选中行的改变事件
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void searchLookUpEdit1View_Click(object sender, EventArgs e)
{
// 获取选中行
var gridView = sender as DevExpress.XtraGrid.Views.Grid.GridView;
if (gridView == null) { return; }
var selectedRow = gridView.GetFocusedRow() as ViewDrug;
var listDataSource = gridView.DataSource as List<ViewDrug>;
// 如果当前点击的列是复选框,就改变它的选中状态
if (gridView.FocusedColumn.FieldName == "IsPicking")
{
selectedRow.IsPicking = !selectedRow.IsPicking;
}
// 更新选中数目的label显示
int count = listDataSource.Where(q => q.IsPicking).Count();
searchResult.Text = $"已选择 {count} 个项目。";
}
/// <summary>
/// 自定义显示内容
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void slue_selItemsId_CustomDisplayText(object sender, DevExpress.XtraEditors.Controls.CustomDisplayTextEventArgs e)
{
if (listAllItems != null)
{
e.DisplayText = string.Join("、", listAllItems.Where(q => q.IsPicking).Select(q => q.DrugName).ToList());
}
}
#endregion
5.最终效果
Demo地址