最近拿Linq出來玩,看怎麼用它去查詢TreeView裡的東西,可以下查詢條件,找出TreeView底下的Nodes是否有附合的Text或是其它屬性, 這次就試著用Linq來找看看~
最近拿Linq出來玩,看怎麼用它去查詢TreeView裡的東西,可以下查詢條件,找出TreeView底下的Nodes是否有符合的Text或是其它屬性,這次就試著用Linq來找看看~
比如說TreeView長的像下面這個樣子,要怎麼去找出符合我們輸入的關鍵字.
剛開始試的時候,就遇到一個問題,如果我用下面的寫法,那麼只會找該層的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展開,並改為紅色的字.
原始碼 : FindTreeNode.zip