最近拿Linq出來玩,看怎麼用它去查詢TreeView裡的東西,可以下查詢條件,找出TreeView底下的Nodes是否有符合的Text或是其它屬性,這次就試著用Linq來找看看~
比如說TreeView長的像下面這個樣子,要怎麼去找出符合我們輸入的關鍵字.
剛開始試的時候,就遇到一個問題,如果我用下面的寫法,那麼只會找該層的Nodes,子Nodes就不會去找.
1 |
var nodes = from TreeNode chi in treeView1.Nodes |
2 |
where chi.Text.ToUpper().Contains(textBox1.Text.ToUpper()) |
看樣子似乎沒辨法直接這麼去找,除非treeView1能夠一次return全部的Nodes,只好從邏輯面著手去完成.
01 |
private void button1_Click( object sender, EventArgs e) |
03 |
if (textBox1.Text.Length == 0) |
05 |
MessageBox.Show( "請輸入查詢條件" ); |
10 |
this .Cursor = Cursors.WaitCursor; |
11 |
treeView1.BeginUpdate(); |
13 |
treeView1.CollapseAll(); |
15 |
FindNode(treeView1.Nodes, ref Cnt); |
16 |
treeView1.EndUpdate(); |
18 |
this .Cursor = Cursors.Default; |
20 |
MessageBox.Show( string .Format( "找到 {0} 筆" , Cnt)); |
23 |
private void FindNode(TreeNodeCollection treeNodeCollection, ref int Count) |
25 |
var undoRedNode = from TreeNode chi in treeNodeCollection |
26 |
where chi.ForeColor == Color.Red |
29 |
foreach (TreeNode tn in undoRedNode) |
31 |
tn.ForeColor = Color.Black; |
34 |
var nodes = from TreeNode chi in treeNodeCollection |
35 |
where chi.Text.ToUpper().Contains(textBox1.Text.ToUpper()) |
38 |
foreach (TreeNode tn in nodes) |
40 |
treeView1.SelectedNode = tn; |
43 |
tn.ForeColor = Color.Red; |
47 |
foreach (TreeNode tn in treeNodeCollection) |
49 |
if (tn.GetNodeCount( false ) > 0) |
51 |
FindNode(tn.Nodes, ref Count); |
這麼一來,只要輸入查詢條件去查詢,就可以將符合條件的Node展開,並改為紅色的字.