DevExpress 的ComboBoxEdit的Item虽然是Object类型,但是绑定实体集的时候,显示的Item是类的名称,这样并不是我们想要的,我们渴望的是能够看到指定那个属性字段,SelectItem的时候返回的是一个实体,
大家想一想为什么我们看到的是下拉类别是类的名称?因为这个类的ToString方法,知道这个切入点就好办了,我们就从重写类的ToString方法入手。
定义一个Student类,重写其ToString方法:
class student
{
public string name { get; set; }
public int id { get; set; }
/// <summary>
/// 重写ToString的方法
/// </summary>
/// <returns></returns>
public override string ToString()
{
return name;
}
当然,大伙更喜欢能够随时指定某个属性字段作为其显示的Item,这个很简单,定义一个构造函数,利用反射就可以了
class student
{
private string _displayField;
public string name { get; set; }
public int id { get; set; }
public student() { }
/// <summary>
/// 显示属性字段名字
/// </summary>
/// <param name="displayField"></param>
public student(string displayField)
{
_displayField = displayField;
}
/// <summary>
/// 重写ToString的方法
/// </summary>
/// <returns></returns>
public override string ToString()
{
if (string.IsNullOrEmpty(_displayField))
return this.GetType().Name;
else
return this.GetType().GetProperty(_displayField).GetValue(this, null)?.ToString();
}
}
解决关键核心问题,下面就正式使用。
/// <summary>
/// 类集合绑定ComboBoxEdit
/// </summary>
void BindCustomComboBox()
{
List<student> ss = new List<student>() {
new student("name") { id = 1, name = "李四" },
new student("name") { id = 2, name = "张三" }
};
comboBoxEdit1.Properties.Items.AddRange(ss.ToArray());
comboBoxEdit1.SelectedIndexChanged += (s, e) =>
{
ComboBoxEdit com = s as ComboBoxEdit;
if (com == null)
return;
if (com.SelectedItem is student)
{
XtraMessageBox.Show((com.SelectedItem as student).id.ToString());
}
};
}
class student
{
private string _displayField;
public string name { get; set; }
public int id { get; set; }
public student() { }
/// <summary>
/// 显示属性字段名字
/// </summary>
/// <param name="displayField"></param>
public student(string displayField)
{
_displayField = displayField;
}
/// <summary>
/// 重写ToString的方法
/// </summary>
/// <returns></returns>
public override string ToString()
{
if (string.IsNullOrEmpty(_displayField))
return this.GetType().Name;
else
return this.GetType().GetProperty(_displayField).GetValue(this, null)?.ToString();
}
}
测试结果:
当然有些人觉得这样有点麻烦,其实DevExpress提供了其他的控件操作,LookUpEdit和GridLookUpEdit,这个两个控件都提供了直接绑定数据源的属性设置,
也允许设置指定列为显示字段和实际值字段,这样就轻松多了。
大致设置如下(gridlookUpedit类似具体可以网上一搜一大把):
1 2 3 |
|
设置显示列大致如下:
lookUpEdit设置:
GridLookUpEdit设置(其实就是内嵌了一个GridControl的控件,设置跟设置GridView方式一样的)