نمایش نتایج 1 تا 8 از 8

نام تاپیک: TreeView با دو روال جديد

  1. #1
    کاربر دائمی آواتار Dariuosh
    تاریخ عضویت
    مهر 1386
    محل زندگی
    ایران - تهران
    پست
    448

    Smile TreeView با دو روال جديد

    سلام
    يکي از مشکلاتي که هميشه با 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 ميتونيد از روال دومي استفاده کنيد



    Public
    Class 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


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

  2. #2
    کاربر دائمی آواتار اَرژنگ
    تاریخ عضویت
    آبان 1384
    محل زندگی
    arjang8000@gmail.com
    پست
    2,736

    نقل قول: TreeView با دو روال جديد

    نقل قول نوشته شده توسط Dariuosh مشاهده تاپیک
    سلام
    يکي از مشکلاتي که هميشه با TreeView داشتم اين بود که وقتي ميخواستم RunTime به اون Node اضافه کنم اگر تعداد Nodeها زياد بود و تودرتو عزا ميگرفتم ...

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

  3. #3
    کاربر دائمی آواتار Dariuosh
    تاریخ عضویت
    مهر 1386
    محل زندگی
    ایران - تهران
    پست
    448

    Smile نقل قول: TreeView با دو روال جديد

    نقل قول نوشته شده توسط اَرژنگ مشاهده تاپیک
    کدی که اراعه دادید با توضیح مشکلی که میخواهید حل کنید بهم نمیخورند (تا جایی که من درک کردم).
    منظورتان از تعداد ندها زیاد بود یعنی چی؟‌ از ۱۰۰۰۰ تا بیشتر؟ و یا اینکه ندهایه تودرتو مثلا ۱۰۰ طبقه عمق داشته باشند؟
    سلام
    از توجهتون متشکرم
    من نيتم از اين جمله از 4 يا 5 طبقه عمق بيشتر بود .

    حالا ميشه نظرتون رو در کل بفرمائيد
    انتقاد يا پيشنهاد هر کدوم باشه ممنون ميشم
    آخرین ویرایش به وسیله Dariuosh : شنبه 11 خرداد 1387 در 21:00 عصر

  4. #4
    کاربر دائمی آواتار Dariuosh
    تاریخ عضویت
    مهر 1386
    محل زندگی
    ایران - تهران
    پست
    448

    Smile نقل قول: TreeView با دو روال جديد

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

  5. #5
    کاربر دائمی آواتار Dariuosh
    تاریخ عضویت
    مهر 1386
    محل زندگی
    ایران - تهران
    پست
    448

    Smile

    بازم سلام
    بد نيست يه مثالي هم بزنم که شايد بيشتر براتون قابل استفاده باشه
    خوب همه ميدونيم که وابستگي به کد خيلي مناسب نيست مثلاً در نظر بگيريد شما برنامه ايي داريد که تو فرم اصلي برنامه از يه 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تون اضافه کنيد

  6. #6
    کاربر دائمی آواتار jafari1
    تاریخ عضویت
    بهمن 1382
    محل زندگی
    ايران
    پست
    368

    نقل قول: TreeView با دو روال جديد

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

  7. #7
    کاربر دائمی آواتار Dariuosh
    تاریخ عضویت
    مهر 1386
    محل زندگی
    ایران - تهران
    پست
    448

    Smile نقل قول: TreeView با دو روال جديد

    نقل قول نوشته شده توسط jafari1 مشاهده تاپیک
    براي اضافه كردن node از چند جدول كه اطلاعات هر جدول در يك سطح tree است به چند datareader اجتياج است ولي با يكي بيشتر نميشود كار كرد چون پيام ميدهد يك ديتا ريدر باز است و بايد بسته شود آيا راه ديگري است؟
    برا کار با چند جدول راهاي زيادي هست مثل درست کردن يه View يا درست کردن يه Quary مناسب حالا اگه شما يه ذره بيشتر راجع به مشکلتون توضيح بديد شايد بشه کمک بهتري کرد

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

  8. #8
    کاربر دائمی آواتار Hossis
    تاریخ عضویت
    آبان 1386
    محل زندگی
    بیرجند
    پست
    1,731

    نقل قول: TreeView با دو روال جديد

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

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •