如何获取datagridview中的parent项

How to get the parent items in datagridview

我的数据网格视图有 5 列 [ID, Code, Name, Desc, ParentID]

数据分为 3 个级别 (Country, State, City)

数据示例

ID  Code  Name       Desc             ParentID
15  A31   Canada     Frams, Water     0
16  J83   Ontario    Cars, Farms      15
17  K76   Alberta    Water            15
18  K24   Toronto    Fish, People     16
19  W83   Ottawa     Cars, Air        16
20  S74   Australia  Farms, People    0
21  W11   Victoria   Buses, Cars      20
22  K39   Melbourne  Fish, Sky        21

我根据 Desc 筛选 datagridview,如下所示

        BindingSource bs = new BindingSource();
        bs.DataSource = dataGridView1.DataSource;
        bs.Filter = string.Format("Desc like '%" + textBox1.Text + "%'");
        dataGridView1.DataSource = bs; 

这工作正常。

但是如果用户正在搜索 Desc = "Fish"

在那种情况下,网格将只显示多伦多和墨尔本。

ID  Code  Name       Desc             ParentID
18  K24   Toronto    Fish, People     16
22  K39   Melbourne  Fish, Sky        21

我希望所有层次结构都向上搜索

我的意思是我想展示安大略省多伦多的 Parent 和加拿大安大略省的 parent

同样适用于墨尔本 -> 维多利亚 -> 澳大利亚

所以我的网格将显示这些记录

ID  Code  Name       Desc             ParentID
15  A31   Canada     Frams, Water     0
16  J83   Ontario    Cars, Farms      15
18  K24   Toronto    Fish, People     16
20  S74   Australia  Farms, People    0
21  W11   Victoria   Buses, Cars      20
22  K39   Melbourne  Fish, Sky        21

如何在过滤器中做到这一点?

这就是我想出的方法来获得您需要的结果:

 private void button1_Click(object sender, EventArgs e)
    {
        BindingSource mainSource = new BindingSource();
        mainSource.DataSource = dataGridView1.DataSource;
        mainSource.Filter = string.Format("Desc like '%" + textBox1.Text + "%'");

        BindingSource resultSource = new BindingSource();

        getParents(mainSource, resultSource);

        dataGridView1.DataSource = resultSource;
    }

为了得到初始结果的父级,可以实现这个并且可以递归地得到父级。

private void getParents(BindingSource mainSource, BindingSource resultSource)
    {
        List<int> parentIdList = new List<int>();

        foreach (var item in mainSource.List)
        {
            resultSource.List.Add(item);
        }

        foreach (DataRowView item in mainSource.List)
        {
            parentIdList.Add((int)item.Row["ParentId"]);
        }

        if (parentIdList.Count > 0)
        {
            var parentIdCSV = string.Join(",", parentIdList);
            mainSource.Filter = string.Format("Id IN ({0})", parentIdCSV);
            getParents(mainSource, resultSource);
        }
    }

希望对你有所帮助。编码愉快。