我希望能够选择DataGridView中显示的列。即,我有一个返回IEnumerable的linq查询,但我不想显示Policy的所有属性 - 我想让用户选择要显示的内容。所以我认为像这样的东西可能会创建一个只有我想要的列的“更窄”的对象。
IEnumerable<Policy> policies = repository.GetPolicies();
var results = from p in policies select new {
if (userPicked("PropertyOne")) PropertyOne = p.PropertyOne,
if (userPicked("PropertyTwo")) PropertyTwo = p.PropertyTwo,
...
};
dataGridView1.DataSource = results;
有优雅的方法吗?
第2部分: 为什么这样做:
IEnumerable<Policy> policies = repository.GetPolicies();
dataGridView1.DataSource = policies;
但这不是:
IEnumerable<Policy> policies = repository.GetPolicies();
var results = from p in policies select p;
dataGridView1.DataSource = results;
在第二种情况下,网格中不显示任何内容。
答案 0 :(得分:3)
如果您需要动态选择字段,请使用Dynamic Linq。它包含一个Select
扩展方法,它接受一串字段,因此您可以决定在运行时选择哪些字段:
public static IQueryable Select(this IQueryable source,
string selector, params object[] values);
使用示例:
var products = db.Products
.Where(condition)
.OrderBy("Name")
.Select(" new (ItemId,Name,Model,onsale)");
第2部分:您的网格需要一个可绑定的接口,例如IList
,但第二个代码示例返回IQueryable
。您可以致电IList
将其转换为ToList()
。
var results = (from p in policies select p).ToList();