如果我在这里遗漏了一些明显的内容,我很抱歉。。。。
我正在尝试自定义一种方法来创建一个RadComboBox过滤器,该过滤器可以根据用户的类型进行调整(基于Telerik演示)。我使用业务逻辑层来拉入我的数据源,然后我尝试使用linq来选择组合框OnItemsRequested的值,这取决于哪个组合框发出了请求。我正试图在"where"子句中设置基于哪个GridColumn过滤器发出请求的参数。
这是我填写列表的代码:
private void list_ItemsRequested(object o, RadComboBoxItemsRequestedEventArgs e)
{
((RadComboBox)o).DataTextField = this.DataField;
((RadComboBox)o).DataValueField = this.DataField;
var employees = from emp in EmployeeBL.GetAllEmployees()
where emp.(this.UniqueName).Contains(e.Text)
select emp;
((RadComboBox)o).DataSource = employees;
((RadComboBox)o).DataBind();
}
是否需要将UniqueName强制转换为数据对象(EmployeeDTO)中的参数?
谢谢。
更新::感谢反馈,我在填充组合框列表方面取得了一些成功。然而,我想我的linq语句中仍然有一个错误。然而,该列表是第一次构建的,当我尝试进行"StartsWith"比较时,页面会抛出一个错误,称数据源不包含数据行,尽管我肯定在键入一个"可查找"字符串。
这是我现在拥有的。
private void list_ItemsRequested(RadComboBox o, RadComboBoxItemsRequestedEventArgs e)
{
o.DataTextField = this.DataField;
o.DataValueField = this.DataField;
DataTable dt = EmployeeBL.GetAllEmployees().AsDataTable();
IEnumerable<DataRow> query =
from emp in dt.AsEnumerable()
where emp.Field<String>(this.UniqueName).StartsWith(e.Text)
select emp;
DataTable boundTable = query.CopyToDataTable<DataRow>();
o.DataSource = boundTable;
o.DataBind();
}
没有内置的方法。你有一些选择:
- 使用类似ScottGu的动态Linq查询库
- 使用反射根据属性名称生成表达式
- 使用
switch
语句从已知的属性列表中选择表达式(易于编码,动态性较差) - 使用
CopyToDataTable
扩展方法创建一个支持通过DataView
进行基于字符串的排序/筛选的数据表
您是否试图对每个员工调用this.UniqueName
中命名的方法,并查看结果是否包含文本?是这样,你可以使用反射。
如果您确定o
是RadComboBox
,那么它也可以按原样传入。
private void list_ItemsRequested(RadComboBox o, RadComboBoxItemsRequestedEventArgs e)
{
o.DataTextField = this.DataField;
o.DataValueField = this.DataField;
PropertyInfo property = typeof(EmployeeDTO).GetProperty(this.UniqueName);
var employees = from emp in EmployeeBL.GetAllEmployees()
where ((IQueryable<string>)(property.GetValue(emp))).Contains(e.Text)
select emp;
o.DataSource = employees;
o.DataBind();
}