首页 > 解决方案 > Linq 填充 Treeview 控件:实时过滤

问题描述

当用户单击复选框时,我想更新 Treeview。我有一个包含艺术家/专辑/歌曲/和其他一些标准的数据表。树视图包含 2 个级别:艺术家和专辑(每个艺术家 1 个或多个)

所以我有一个原始的 linq 查询,如下所示:

var query = (from i in Globals.ds.Tables[0].AsEnumerable() 
            select new { art = i.Field<string>("artiste"), alb = i.Field<string>("album"), dis = i.Field<string>("disque") })
            .Distinct()
            .GroupBy(g=> g.art)
            .OrderBy(g => g.Key);

“disque”是根据专辑类型(LP 或 12" 或两者兼有)过滤 Treeview 的附加信息,然后我有 2 个 foreach 循环很好地填充树视图(查询不显示歌曲,这很好每个艺人的专辑数量)

当用户单击框(LP、12" 或两者)时,我想更新查询“实时”,所以我有以下内容(我对 12" 有相同的 linq):

  if (!LP.Checked)
        {
            query = query.Where(p => (string)p.dis != "LP") ;
        }

但是“p.dis”不可用,我只有“p.key”,即艺人。

我如何在该步骤使用 .where ?谢谢

标签: c#linq

解决方案


试试看这个简单的演示。也许它可以指导您如何实现您想要的:

void Main()
{
    var data = new List<Data>
    {
        new Data { Art = "Art1", Alb = "Alb1", Dis = "LP"},
        new Data { Art = "Art1", Alb = "Alb2", Dis = "12"},
        new Data { Art = "Art2", Alb = "Alb1", Dis = "LP"},
        new Data { Art = "Art3", Alb = "Alb1", Dis = "LP"}
    }; 

    var query = 
        (from i in data
        select new Data { Art = i.Art, Alb = i.Alb, Dis = i.Dis })
        .Where(WhereFunc())
        .Distinct()
        .GroupBy(g => g.Art)
        .OrderBy(g => g.Key);
}

static Func<Data, bool> WhereFunc() => (p) =>
{                
    if (!LP.Checked)
    {
        return (string)p.Dis != "LP";
    }
    else
    {
        return (string)p.Dis == "LP";
    }
};

public class Data
{
    public string Art {get; set;}
    public string Alb {get; set;}
    public string Dis {get; set;}
}

推荐阅读