PDA

View Full Version : جستجو در TreeView



kati
سه شنبه 22 شهریور 1384, 13:48 عصر
سلام
اگه بخواهیم یک نود رو توی TreeView پیدا کنیم باید از حلقه بازگشتی استفاده کنیم؟:ناراحت:
یا راه دیگری داره؟

marmar
چهارشنبه 23 شهریور 1384, 13:49 عصر
اگه اون نود که دنبالش هستی تیک خورده باشه می تونی از این حالقه استفاده کنی

for(int w=0;mydatareader1.Read();w++)
{
if(TreeView2.FindNode(System.Convert.ToString(myda tareader1.GetDecimal(0))).Selected==true)
{

موفق باشی

kati
چهارشنبه 23 شهریور 1384, 18:07 عصر
ممنون از جوابتون
ولی TreeView متد FindNode را نداره یا من پیدا نمی کنم :ناراحت:
من می خواهم یک نود که کاربر وارد textBox کرده را در TreeView های لایت کنم.

starsilver
شنبه 02 اردیبهشت 1391, 13:49 عصر
ممنون از جوابتون
ولی TreeView متد FindNode را نداره یا من پیدا نمی کنم :ناراحت:
من می خواهم یک نود که کاربر وارد textBox کرده را در TreeView های لایت کنم.


سلام
واسه كسايي كه هنوز لازم دارن اين كد رو
http://www.visualwebgui.com/Developers/Forums/tabid/364/forumid/29/threadid/20747/scope/posts/Default.aspx

رافعی مهدی
شنبه 02 اردیبهشت 1391, 16:25 عصر
سلام
برای جستجو و هایلایت کردن نتایج به سه تا متد نیاز داریم:

متدی که در مجموعه ای از TreeNodeها به دنبال string داده شده بگردد (SearchNodeCollection)
متدی که موارد پیدا شده رو هایلایت کند (EmbossSearchResults)
متدی که هایلایتها رو پاک کند (ClearSearchResults)


1- متد SearchNodeCollection:


private List<TreeNode> SearchNodeCollection(string phrase, TreeNodeCollection nodeCollection)
{
if (phrase.Trim().Length == 0)
return null;

List<TreeNode> foundNodeList = new List<TreeNode>();

foreach (TreeNode node in nodeCollection)
{
if (node.Text.Contains(phrase))
{
foundNodeList.Add(node);
}
foundNodeList.AddRange(SearchNodeCollection(phrase , node.Nodes));
}
return foundNodeList;
}

2- متد EmbossSearchResults:


private void EmbossSearchResults(List<TreeNode> nodeList)
{
if (nodeList == null)
return;

foreach (TreeNode node in nodeList)
{
node.BackColor = Color.LightCyan;
node.ForeColor = Color.Blue;
}
}

3- متد ClearSearchResults:


private void ClearSearchResults(TreeNodeCollection nodeCollection)
{
foreach (TreeNode node in nodeCollection)
{
node.BackColor = Color.White;
node.ForeColor = Color.Black;

ClearSearchResults(node.Nodes);
}
}

همانطور که میبینید متد اول بازگشتی (Recursive) هست. برای استفاده از این متدها، مثلا در رویداد کلیک دکمه جستجو میتوان نوشت:


ClearSearchResults(treeView.Nodes);

List<TreeNode> foundNodes = SearchNodeCollection(txtSearch.Text.Trim(), treeView.Nodes);
EmbossSearchResults(foundNodes);

سرعت اجرای این کد در کالکشنهای خیلی بزرگ میتونه چندان مطلوب نباشه. برای بهبود وضعیت عملکرد متد SearchNodeCollection میتوانیم از yield استفاده کنیم که سرعت رو به حد چشمگیری بهبود میبخشه. بنابراین متدهای اول و دوم رو میتونیم به شکل زیر بازنویسی کنیم:

1- متد SearchNodeCollection:


private IEnumerable<TreeNode> SearchNodeCollection(string phrase, TreeNodeCollection nodeCollection)
{
if (phrase.Trim().Length == 0)
yield return null;

foreach (TreeNode node in nodeCollection)
{
if (node.Text.Contains(phrase))
{
yield return node;
}

foreach (TreeNode foundNode in SearchNodeCollection(phrase, node.Nodes))
{
yield return foundNode;
}
}
}
2- متد EmbossSearchResults:



private void EmbossSearchResults(string phrase, TreeNodeCollection nodeCollection)
{
foreach (TreeNode node in SearchNodeCollection(phrase, nodeCollection))
{
if (node == null)
break;

node.BackColor = Color.LightCyan;
node.ForeColor = Color.Blue;
}
}
که برای استفاده از آنها داریم:

EmbossSearchResults(txtSearch.Text.Trim(), treeView.Nodes);