如果我在这里遗漏了一些明显的东西,我表示歉意....
我正在尝试自定义一种创建RadComboBox过滤器的方法,该过滤器可以根据用户类型进行调整(基于Telerik演示)。我正在使用业务逻辑层来提取我的数据源,然后我尝试使用linq来选择组合框OnItemsRequested的值,具体取决于哪个组合框发出了请求。我正在尝试根据GridColumn过滤器发出请求在“where”子句中设置参数。
这是填写列表的代码:
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();
}
我是否需要在我的数据对象(EmployeeDTO)中将UniqueName转换为参数?
感谢。
UPDATE :: 感谢您的反馈,我在填充组合框列表方面取得了一些成功。但是,我认为我的linq声明中仍然存在误导。该列表第一次构建,但是,当我尝试进行“StartsWith”比较时,该页面抛出错误,指出数据源不包含数据行,即使我肯定键入“findable” “字符串。
这就是我现在所拥有的。
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();
}
答案 0 :(得分:1)
没有内置方式。你有一些选择:
switch
语句从已知属性列表中选择表达式(易于编码,动态性较差)CopyToDataTable
扩展方法创建 支持基于字符串的排序/过滤的数据表DataView
s 答案 1 :(得分:1)
您是否尝试在每个员工上调用this.UniqueName
中指定的方法,并查看结果是否包含文本?是这样,你可以使用反射。
如果您确定o
是RadComboBox
,那么它也可以传入。{/ p>
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();
}