用Linq找TreeView底下的東西

最近拿Linq出來玩,看怎麼用它去查詢TreeView裡的東西,可以下查詢條件,找出TreeView底下的Nodes是否有附合的Text或是其它屬性, 這次就試著用Linq來找看看~

最近拿Linq出來玩,看怎麼用它去查詢TreeView裡的東西,可以下查詢條件,找出TreeView底下的Nodes是否有符合的Text或是其它屬性,這次就試著用Linq來找看看~

 

比如說TreeView長的像下面這個樣子,要怎麼去找出符合我們輸入的關鍵字.

image

剛開始試的時候,就遇到一個問題,如果我用下面的寫法,那麼只會找該層的Nodes,子Nodes就不會去找.

var nodes = from TreeNode chi in treeView1.Nodes
                   where chi.Text.ToUpper().Contains(textBox1.Text.ToUpper())
                   select chi;

看樣子似乎沒辨法直接這麼去找,除非treeView1能夠一次return全部的Nodes,只好從邏輯面著手去完成.

private void button1_Click(object sender, EventArgs e)
{
	if (textBox1.Text.Length == 0) 
	{ 
		MessageBox.Show("請輸入查詢條件"); 
		textBox1.Focus(); 
		return; 
	}

	this.Cursor = Cursors.WaitCursor;
	treeView1.BeginUpdate();
	
	treeView1.CollapseAll();
	int Cnt = 0;
	FindNode(treeView1.Nodes, ref Cnt);
	treeView1.EndUpdate();

	this.Cursor = Cursors.Default;
	
	MessageBox.Show(string.Format("找到 {0} 筆", Cnt));
}

private void FindNode(TreeNodeCollection treeNodeCollection, ref int Count)
{
	var undoRedNode = from TreeNode chi in treeNodeCollection
					  where chi.ForeColor == Color.Red
					  select chi;

	foreach (TreeNode tn in undoRedNode)
	{
		tn.ForeColor = Color.Black;
	}

	var nodes = from TreeNode chi in treeNodeCollection
				where chi.Text.ToUpper().Contains(textBox1.Text.ToUpper())
				select chi;

	foreach (TreeNode tn in nodes)
	{
		treeView1.SelectedNode = tn;
		tn.Expand();
		Count++;
		tn.ForeColor = Color.Red;
	}


	foreach (TreeNode tn in treeNodeCollection)
	{
		if (tn.GetNodeCount(false) > 0)
		{
			FindNode(tn.Nodes, ref Count);
		}
	}

}

 

這麼一來,只要輸入查詢條件去查詢,就可以將符合條件的Node展開,並改為紅色的字.

image

 

原始碼 : FindTreeNode.zip