这是我的问题,所以我解决了它,然后决定与大家分享。
我有一份我的司机类列表。
我从DB加载数据,然后在datagridview中显示:
List<driver> list = DriverList();
dgvListDrivers.DataSource = list;
在组合框中加载字段名称:
List<ColNameText> l = new List<ColNameText>();
foreach (DataGridViewColumn item in dgvListDrivers.Columns)
{
ColNameText cnt=new ColNameText();
cnt.colname=item.Name;
cnt.displaytext=item.HeaderText;
l.Add(cnt);
}
comboBoxEx1.DataSource=l.ToList();
comboBoxEx1.DisplayMember = "displaytext";
下面的是ColNameText Class Definaton:
class ColNameText
{
public string colname { get; set; }
public string displaytext { get; set; }
}
现在我希望能够按驱动程序类属性搜索列表。
我搜索了许多解决方案,但它们并不是我想要的方式。
答案 0 :(得分:1)
这看起来像LINQ表达式可以帮助:
static List<T> FindWhereMemberContains<T>(this List<T> list,
string memberName, string value)
{
var p = Expression.Parameter(typeof(T));
var lambda = Expression.Lambda<Predicate<T>>(Expression.Call(
Expression.Call(Expression.PropertyOrField(p, memberName), "ToString", null),
"Contains", null, Expression.Constant(value, typeof(string))), p);
return list.FindAll(lambda.Compile());
}
使用:
dgvListDrivers.DataSource = list.FindWhereMemberContains(p.colname, txtSearch.Text);
对于大型列表,这将比原始反射快得多;对于小型列表,基本反射(没有元编程开销)可能会更快 - 您需要进行测试。
非表达但仍然不太糟糕的版本可能是:
static List<T> FindWherePropertyContains<T>(this List<T> list,
string propertyName, string value)
{
var property = (Func<T, object>)Delegate.CreateDelegate(typeof(Func<T, object>),
typeof(T).GetProperty(propertyName).GetGetMethod());
return list.FindAll(x => property(x).ToString().Contains(value));
}
答案 1 :(得分:0)
以下是您在列表中搜索的最简单方法。 这发生在textbox_textchange事件中:
*[local-name()='bind']