如何获取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);
}
}
希望对你有所帮助。编码愉快。
我的数据网格视图有 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);
}
}
希望对你有所帮助。编码愉快。