PDA

View Full Version : TreeView با دو روال جديد



Dariuosh
شنبه 11 خرداد 1387, 09:38 صبح
سلام
يکي از مشکلاتي که هميشه با TreeView داشتم اين بود که وقتي ميخواستم RunTime به اون Node اضافه کنم اگر تعداد Nodeها زياد بود و تودرتو عزا ميگرفتم ...

هر Node يه Property داره به نام FullPath که آدرس اون Node رو برميگردونه
مثلاً اينطوري

Node0\Node1\Node2\Node3
يعني از Root شروع ميکنه تا به اون Node مورد نظر برسه و اونارو با "\" که قابل تغيير هم هست از هم جدا ميکنه

براي رفع اين مشکل من دوتا متد به TreeView اضافه کردم
اولي FullPathAdder هستش که FullPath رو ميگره و خودش تمامه مسير رو درست ميکنه
دومي هم که FullPathDescAdder هستش ، همونه فقط يه فرقي تو FullPathاش ميکنه در واقع syntaxاش فرق ميکنه

"Node1";"اسم اول"\"Node2";"اسم دوم "\.....
يعني هر آيتم رو با " ; " به دو تيکه تبديل کردم که اولي Name ميشه و دومي Text هر کدومشون رو هم تو " (دابل کتيشن) گذاشتم

نکته : شما اگه با روال اولي Node اضافه کنيد Name و Text يه چيز ميشه و از اونجايي که احتمالاً ميخواهيد Text يه متن فارسي باشه و Name يه اسم Eng ميتونيد از روال دومي استفاده کنيد




PublicClass TreeView
Inherits System.Windows.Forms.TreeView
PublicSub FullPathAdder(ByVal Path AsString)
Const PathSpliter = "\"' Chr(92)
Dim PathItem() AsString
Dim i AsInteger
PathItem = Path.Split(PathSpliter)
For i = 0 To PathItem.Length - 1
Dim nodes() As Windows.Forms.TreeNode = Nothing
Dim ChildNode AsNew System.Windows.Forms.TreeNode
Dim ParentNode AsNew System.Windows.Forms.TreeNode
ChildNode.Name = PathItem(i)
If i = 0 Then
nodes = Me.Nodes.Find(ChildNode.Name, True)
If nodes.Length = 0 Then
Me.Nodes.Add(ChildNode)
EndIf
Else
nodes = Me.Nodes.Find(ChildNode.Name, True)
If nodes.Length = 0 Then
ParentNode.Name = PathItem(i - 1)
nodes = Me.Nodes.Find(ParentNode.Name, True)
ParentNode = nodes(0)
ParentNode.Nodes.Add(ChildNode)
EndIf
EndIf
Next
EndSub
PublicSub FullPathDescAdder(ByVal Path AsString)
Const PathSpliter = "\"' Chr(92)
Const NodeSpliter = ";"' Chr(59)
Dim PathItem() AsString
Dim NodeItm() AsString
Dim i AsInteger
PathItem = Path.Split(PathSpliter)
For i = 0 To PathItem.Length - 1
Windows.Forms.Application.DoEvents()
Dim nodes() As Windows.Forms.TreeNode = Nothing
Dim ChildNode AsNew System.Windows.Forms.TreeNode
Dim ParentNode AsNew System.Windows.Forms.TreeNode
NodeItm = PathItem(i).Split(NodeSpliter)
FillNode(ChildNode, NodeItm)
If i = 0 Then
nodes = Me.Nodes.Find(ChildNode.Name, True)
If nodes.Length = 0 Then
Me.Nodes.Add(ChildNode)
EndIf
Else
nodes = Me.Nodes.Find(ChildNode.Name, True)
If nodes.Length = 0 Then
NodeItm = PathItem(i - 1).Split(NodeSpliter)
FillNode(ParentNode, NodeItm)
nodes = Me.Nodes.Find(ParentNode.Name, True)
ParentNode = nodes(0)
ParentNode.Nodes.Add(ChildNode)
EndIf
EndIf
Next
EndSub
PrivateSub FillNode(ByRef Node As Windows.Forms.TreeNode, ByValParamArray Info() AsString)
With Node
.Name = Trim(Info(0).Replace(Chr(34), Chr(32)))
.Text = Trim(Info(1).Replace(Chr(34), Chr(32)))
EndWith
EndSub
EndClass


اگه جايش مشکل داشت يا پيشنهادي برا بهتر شدنش داشتيد ممنون ميشم متذکر شيد
موفق باشيد

اَرژنگ
شنبه 11 خرداد 1387, 19:43 عصر
سلام
يکي از مشکلاتي که هميشه با TreeView داشتم اين بود که وقتي ميخواستم RunTime به اون Node اضافه کنم اگر تعداد Nodeها زياد بود و تودرتو عزا ميگرفتم ...



کدی که اراعه دادید با توضیح مشکلی که میخواهید حل کنید بهم نمیخورند (تا جایی که من درک کردم).
منظورتان از تعداد ندها زیاد بود یعنی چی؟‌ از ۱۰۰۰۰ تا بیشتر؟ و یا اینکه ندهایه تودرتو مثلا ۱۰۰ طبقه عمق داشته باشند؟

Dariuosh
شنبه 11 خرداد 1387, 20:38 عصر
کدی که اراعه دادید با توضیح مشکلی که میخواهید حل کنید بهم نمیخورند (تا جایی که من درک کردم).
منظورتان از تعداد ندها زیاد بود یعنی چی؟‌ از ۱۰۰۰۰ تا بیشتر؟ و یا اینکه ندهایه تودرتو مثلا ۱۰۰ طبقه عمق داشته باشند؟

سلام
از توجهتون متشکرم
من نيتم از اين جمله از 4 يا 5 طبقه عمق بيشتر بود .

حالا ميشه نظرتون رو در کل بفرمائيد
انتقاد يا پيشنهاد هر کدوم باشه ممنون ميشم

Dariuosh
دوشنبه 13 خرداد 1387, 22:54 عصر
خوب شما که نه انتقادي کردين نه پيشنهادي برا همين من خودم يه ذره کامل ترش کردم
کد نزاشتم چون خيلي زياد ميشد
اضافه شده ها
1- Peropertyايي به نام FullDescPath که همون FullPath هست اما به شکل همون Syntaxايي که از خودم در آوردم ( بالا توضيح دادم )
2- Propertyايي به نام CheckedNodes که تمام Nodeهايي رو که CheckBoxاشون تيک خورده برميگردونه
3- Propertyايي به نام CheckParent که اگه True باشه وقتي شما يه Node رو تيک ميزنيد parentهاشم تيک ميخوره

Dariuosh
سه شنبه 14 خرداد 1387, 12:02 عصر
بازم سلام
بد نيست يه مثالي هم بزنم که شايد بيشتر براتون قابل استفاده باشه
خوب همه ميدونيم که وابستگي به کد خيلي مناسب نيست مثلاً در نظر بگيريد شما برنامه ايي داريد که تو فرم اصلي برنامه از يه Menu استفاده کرديد و تمامه مديريت فرمهاتون از طريق اون منو انجام ميشه و در ضمن برايه امنيت ميخواهيد دسترسي کاربران را نيز تايين کنيد که برايه اين کار احتياج به يه فرم دارين که احتمالاً يه TreeView هم داره و اسم تمام فرمهارو همونطوري که تو منو داشتين بايد بياره که با تيک زدن هر Node اجازه دسترسي اون کاربر رو به اون منو بديد
يه راهش اينه که شما تمامه منوها يا Nodeهايه اون Tree رو در زمان ديزاين درست کنيد که با هر بار اضافه و کم شدن يا تغيير تو نام يه منو تمام اين مراحل رو بايد از اول بريد .
يه راهه ديگه هم داره اونم اينه که شما تو ديتابيس برنامتون يه جدول اضافه کنيد با اين فرض که فيلدهاش از قراره زير باشن
1- Code از نوع int
2- ParentCode از نوع int
3- Name از نوع varchar(500)
4- PName از نوع varchar(500)


CREATE TABLE dbo.GnrRole
(
Code int NOT NULL,
ParentCode int NULL,
Name varchar(500) NOT NULL,
PName varchar(500) NOT NULL
) ON [PRIMARY]


فيلد Code شماره هر آيتم هست
فيلد ParentCode که شماره آيتم پدر هست ( شماره ايي که تو همين جدول بهش اختصاص داديم )
فيلد Name اسمي است که ما تو برنامه ميخوايم ازش استفاده کنيم
فيلد PName هم شرح اون آيتم هست در واقع چيزي که ميخوايم تو برنامه ببينيم

تازه رسيديم قسمت شيرين ماجرا
حالا فقط کافيه که شما تو فرم لود حقوق و دسترسي کاربراتون با يه DataReader دونه دونه اين آيتمهارو به Treeتون اضافه کنيد

jafari1
چهارشنبه 22 خرداد 1387, 22:27 عصر
تازه رسيديم قسمت شيرين ماجرا
حالا فقط کافيه که شما تو فرم لود حقوق و دسترسي کاربراتون با يه DataReader دونه دونه اين آيتمهارو به Treeتون اضافه کنيد
براي اضافه كردن node از چند جدول كه اطلاعات هر جدول در يك سطح tree است به چند datareader اجتياج است ولي با يكي بيشتر نميشود كار كرد چون پيام ميدهد يك ديتا ريدر باز است و بايد بسته شود آيا راه ديگري است؟

Dariuosh
پنج شنبه 23 خرداد 1387, 09:42 صبح
براي اضافه كردن node از چند جدول كه اطلاعات هر جدول در يك سطح tree است به چند datareader اجتياج است ولي با يكي بيشتر نميشود كار كرد چون پيام ميدهد يك ديتا ريدر باز است و بايد بسته شود آيا راه ديگري است؟

برا کار با چند جدول راهاي زيادي هست مثل درست کردن يه View يا درست کردن يه Quary مناسب حالا اگه شما يه ذره بيشتر راجع به مشکلتون توضيح بديد شايد بشه کمک بهتري کرد

در مورد DataReader هم تنها راهي که بشه در آنه واحد از چندتاش باهم استفاده کرد اينه که به تعداد اونا Connection باز کني که شايد کاره منطقي نباشه !
چون DataReader در زمان فعاليت Connection شما رو مشغول ميکنه و اجازه دسترسي رو به درخواست ديگه ايي نميده . اگرم Closeاش کني که انگار همه چي از اول

Hossis
دوشنبه 18 آذر 1387, 19:08 عصر
[QUOTE=Dariuosh;535275]برا کار با چند جدول راهاي زيادي هست مثل درست کردن يه View يا درست کردن يه Quary مناسب حالا اگه شما يه ذره بيشتر راجع به مشکلتون توضيح بديد شايد بشه کمک بهتري کرد
شما بايد يک کانکشن با چندين رکورد ست ايجاد کنيد که هر رکورد ست يک جدول رو باز کنه
يا مي‌توني در هر تابع، رکورد ست رو باز کرده و در انتهايش ببندي تا براي باز کردن جداول ديگر بسته باشه
در اين آدرس ، يک مثال و پروژه مهم مخصوص همين کار هستش هرچند با وي بي 6 نوشته شده اما در اين مسئله هيچ تفاوتي نمي‌کنه

http://vbghasemi.blogfa.com