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

نام تاپیک: مقاله : روشی برای نمایش گروهها و زیرگروه ها در یک برنامه بانک اطلاعاتی در یک TreeView

  1. #1

    مقاله : روشی برای نمایش گروهها و زیرگروه ها در یک برنامه بانک اطلاعاتی در یک TreeView

    سلام
    من چند وقت پیش در یک برنامه کتابخانه که نوشته بودم ، یک روشی رو برای نمایش لیست گروه ها و زیرگروه ها استفاده کردم که گفتن اون میتونه برای بعضی از دوستان که با DBTreeView ها مشکل دارند مفید باشه
    فرض کنیم ما در برناممون 3 تا جدول داریم :
    • جدولی برای نام گروهها
    • جدولی برای نام زیرگروهها
    • جدولی به عنوان جدول اصلی

    چون من در یک برنامه مدیریت کتابخانه از این روش استفاده کردم ، مراحل کار در یک برنامه کتابخانه رو مثال می زنم ( البته فرقی نداره چه نرم افزاری باشه )
    فرض میکنیم که نام جداول به صورت زیر هست :
    • GroupTable : برای لیست گروهها
    • SubGroupTable : برای لیست زیرگروهها
    • MainTable : جدول اصلی


    نکته مهم :
    در این برنامه ما سعی خواهیم کرد که مشخصات کتابها را در زیرگروه ها ثبت کنیم پس برای درج شدن مشخصات یک کتاب ، انتخاب گروه و زیرگروه الزامی است !
    حالا نوبت به ساخت فیلدهای بانک های مورد نظر میرسه :

    فیلد مربوط به جدول مربوط به گروه ها : ( فقط یک فیلد )
    1. GName : برای نام گروهها


    فیلدهای مربوط به جدول مربوط به زیرگروه ها :
    1. GName : برای نام گروه ها
    2. SGName : برای نام زیرگروه ها


    فیلدهای بانک اصلی : ( چون قصد نوشتن یک برنامه نمونه و کوچک رو داریم تنها به ساخت چند فیلد برای این جدول اکتفا میکنیم )
    1. BName : نام کتاب
    2. AName : نام نویسنده کتاب
    3. ...
    4. GName : نام گروه
    5. SGName : نام زیرگروه


    بعد از ساخت جداول و فیدهای مربوطه ، سه ADOTable روی فرم گذاشته و نامهایی که در بالا اشاره شد را به آنها نسبت دهید ( درواقع جداول مربوط به گروه ها ، زیرگروه ها و جدول اصلی ) و درآخر یک TreeView روی فرم قرار داده و نام آن را به "MTreeView " تغییر دهید ...

    بعد از مراحل بالا ما باید یک Procedure بنویسیم که اطلاعات موجود در جدول گروهها و زیرگروهها رو در یک TreeView ثبت کنه ...

    Procedure مورد نظر باید به شکل زیر باشه :
    procedure TMainFrm.UpdateTreeView;
    var
    I, I2 : Integer;
    S : String;
    MyNode, Node, Parent : TTreeNode;
    begin
    MTreeView.Items.Clear;
    GroupTable.First;
    SubGroupTable.First;
    Node := nil;
    for I := 0 to GroupTable.RecordCount-1 do
    begin
    S := GroupTableGName.Text;
    MyNode := MTreeView.Items.Add(Node, S);
    Parent := MyNode;
    SubGroupTable.Filter := 'GName = ' + QuotedStr(Parent.Text);
    SubGroupTable.Filtered := True;
    for I2 := 0 to SubGroupTable.RecordCount-1 do
    begin
    MTreeView.Items.AddChild(Parent, SubGroupTableSGName.Text);
    SubGroupTable.Next;
    end;
    Node := MyNode;
    GroupTable.Next;
    end;
    SubGroupTable.Filtered := False;
    GroupTable.Filtered := False;
    end;

    توجه کنید که برای این Procedure نام " UpdateTreeView " انتخاب شده است
    روش کار بسیار ساده و جالب است
    در ابتدای این Procedure ، ما چند متغیر تعریف کردیم :
    • متغیرهای I, I2 برای استفاده در دو حلقه For ( از نوع Integer )
    • متغیر S برای گرفتن و نوشتن متن نام گروه ها و زیرگروهها ( از نوع String )
    • متغیرهای MyNode ، ChildNode و Parent برای مشخص کردن آیتم های TreeView در Procedure ( از نوع TTreeNode )

    در ابتدای این Procedure ما جداول GroupTable ( گروهها ) و SubGroupTable ( زیرگروه ها ) رو به ابتدا ( اولین رکورد ) می بریم ( با دستور First ) ، و متغیر MyNode را برابر با Nil قرار می دهیم.
    سپس در ما در دو حلقه For تودرتو اقدام به نوشتن مقادیر در TreeView میکنیم ، در ابتدا حلقه For اول ما متغیر S را برابر با مقدار موجود در اولین رکورد جدول گروهها ( نام اولین گروه ) قرار میدهیم ، سپس یک آیتم در TreeView ایجاد کرده و متغیر MyNode را برابر با آیتم خواسته شده قرار می دهیم ، بعد متغیر Parent را برابر را مقدار MyNode قرار میدهیم و آن را به عنوان یک گروه که درواقع Parent چند زیرگروه است میشناسیم ، سپس جدول زیرگروهها رو با مقدار موجود در این آیتم TreeView فیلتر میکنیم ...
    در مرحله بعد ، ما اقدام به ثبت یک آیتم Child در TreeView میکنیم ( با دستور AddChild ) ، دستور AddChild که در بالا استفاده شده ، دارای دو متغیر است که اولی برای Parent مربوط به آیتم ثبت شده و دیگری برای متن آیتم است.
    توجه کنید که در هر دو حلقه For از دستور Next برای رفتن به رکورد بعدی در جدول مورد نظر استفاده کنید وگرنه کار با موفقیت انجام نخواهد شد ...
    در مرحله بعد ما متغیر Node را برابر با MyNode قرار میدهیم و جدول گروهها را به رکورد بعدی برده و در آخر دو جدول را از حالت فیلتر خارج می کنیم.
    نکته ای که در بالا باید توضیح داده بشه ، اینه که چرا در قسمت آخر ما متغیر Node رو برابر با MyNode قرار میدهیم ... !
    اگه توجه کنید ما در اول کار با دستور Add ، یک آیتم به TreeView اضافه کردیم که " همانند اون " ( پارامتر اول دستور Add ) ، برابر با Nil بود چون آیتمی در TreeView نبود ، و وقتی که ما آیتم جدید را در TreeView ثبت میکنیم ( به عنوان یک گروه ) باید برای ایجاد آیتم بعدی ( گروه بعدی ) ، یک آیتم که از نوع گروه است به عنوان "همانند" به آیتم جدید اختصاص بدیم که با قرار مقدار MyNode در متغیر Node ، این کار در حلقه For اول انجام میشه ...

    همانطور که در ابتدا اشاره شد بهتر است که ثبت اطلاعات در زیرگروه ها انجام بشه ، برای این کار می تونید در فرم مربوط به ثبت اطلاعات جدید دو تا ComboBox قرار بدید با همین روش و با کمی تغییر ، لیست گروه ها و زیرگروه ها رو در اون دو ComboBox بریزید و در هنگام ثبت اطلاعات از انتخاب شدن گروه و زیرگروه اطمینان حاصل کنید ...

    نمایش رکوردهای مربوط به گروه یا زیرگروه انتخاب شده در TreeView ، در DBGrid :
    برای این که وقتی کاربر یک گروه و یا زیرگروه رو در TreeView انتخاب کرد ، DBGrid فقط رکوردهای مربوط به همون گروه یا زیرگروه انتخاب شده رو نشون بده ، باید در هنگام انتخاب کردن آیتم های TreeView ، تشخیص بدید که آیا آیتم انتخاب شده Parent است یا Child ، اگر Parent ( گروه ) بود ، باید فیلد GName در جدول اصلی ( MainTable ) را با مقدار آیتم انتخاب شده فیلتر کنید همچنین در صورت Child بودن آیتم انتخاب شده ، باید عمل فیلتر را بر روی فیلد SGName مربوط به جدول اصلی انجام بدید ...

    تصویری از TreeView ایجاد شده توسط این Procedure :
    --------------------

    --------------------

    نکته آخر
    مشکل اصلی که همه ما دنبال حل اون هستیم ، اینه که TreeView ما راست به چپ باشه ! که فکر کنم آقای کرامتی کدی رو برای آیینه ای کردن یک WinControl نوشته بودند که میتونید از اون استفاده کنید ( در سایت جستجو کنید پیدا میکنید )

    در ضمن مقاله آقای کرامتی در مورد یک DBTreeView ی راست به چپ هم میتونه توی حل مشکل این قسمت از برنامه های بانک اطلاعاتی مفید باشه ( باز هم با جستجو در سایت پیدا خواهد کرد )


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

    امیدوارم مفید بوده باشه
    موفق باشید ...
    آخرین ویرایش به وسیله Mahmood_M : سه شنبه 07 اردیبهشت 1395 در 06:33 صبح

  2. #2
    کاربر دائمی آواتار cybercoder
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    root/
    پست
    2,018
    توجه کنید که این تنها یک روش و ایده ساختگی هست و راههای بهتری هم میشه پیدا کرد ...
    نگاهی به امضای آقای کرامتی بندازید فکر می کنم در مورد این کار مفید باشه.

    موفق باشید.

  3. #3
    سلام
    نگاهی به امضای آقای کرامتی بندازید فکر می کنم در مورد این کار مفید باشه.

    موفق باشید.
    ممنون از راهنماییتون ، من هم به این موضوع در آخر مقاله اشاره کردم ، ولی کمی خلاقیت هم بد نیست ...

    موفق باشید ...

  4. #4
    با سلام
    من یه مشکل کوچولو در استفاده از این TreeVeiw دارم و اونم اینه که چجوری میتونم 6 نسل فرزند با parent اضافه کنم؟
    آیا میشه جوری برنامه را تغییر داد که بصورت اتوماتیک و دینامیک خودش بر اساس ارتباط بانک اطلاعاتی تعداد فرزندان را نمایش بده؟
    من در دو سطحش را تونستم انجام بدم اما تو مرحله سوم پیغام خطا میده.
    با تشکر

  5. #5

    راهکار

    شما می توانید به شکل زیر عمل کنید با استفاد از یک Table و به صورت بی نهایت درخت ایجاد کنید این الگوریتم با الگوریتم بالا فرق می کند.

    code_v
    code_pe
    onvan
    برای زیرشاخه اصلی code_pe را -1 و و برای بقیه code_pe را code_v قرار دهید و با یک تابع بازگشتی به راحتی می توان این کار انجام داد

    procedure creatnode(CN1: TTreeNode;ss:string;sot:integer);
    var
    CNode: TTreeNode;
    s:string;
    k,i:integer;
    begin
    data_m.chart_d.Filter:=ss;
    data_m.chart_d.Filtered:=true;
    k:=data_m.chart_d.RecordCount;
    if data_m.chart_d.RecordCount>0 then
    for i:=1 to k do
    begin
    data_m.chart_d.Filter:=ss;
    data_m.chart_d.Filtered:=true;
    data_m.chart_d.RecNo:=i;
    form8.TreeView.Selected:=cn1;
    cnode:=form8.TreeView.Items.AddChildObject(form8.T reeView.Selected,trim(data_m.chart_d.FieldByName(' onvan').AsString)+'-'+trim(data_m.chart_d.Fields[0].AsString),form8.TreeView.Selected);
    s:='code_pe='+#39+data_m.chart_d.FieldByName('code _v').AsString+#39;
    creatnode(cnode,s,sot+1);
    end;
    i:=0;
    end;
    عکس های ضمیمه عکس های ضمیمه
    • نوع فایل: jpg 1.JPG‏ (34.2 کیلوبایت, 516 دیدار)
    فایل های ضمیمه فایل های ضمیمه

  6. #6
    با سلام
    خیلی ممنون مشکل این قسمت حل شد.
    فقط یه مورد دیگه و اون هم اینکه وقتی از بانک اطلاعاتی دیتا را میخونم چجوری میشه ID هر رکورد را به یک نود ارتباط داد تا وقتی که کاربر آن را انتخاب میکند بتونم ID اون گزینه را بدست بیارم و زیرمجموعه های آن را در یک دیتا گرید نشان بدهم؟
    اگه بخوام هر فرزند و والدی یه رنگ متفاوت داشته باشه چجوری میشه؟
    با تشکر

  7. #7

    برای بدست آوردن parent ها

    به راحتی می توان این کار را انجام داد اگر توجه کرده باشید پهلوی هر عنوان کد آن نوشته شده و با گذاشت یه
    while code_pe<>-1 do
    begin
    locate('code_v',code_pe,[]) //locate Parent
    عملیات بر روی داده
    end;

    if code_p=-1 then
    begin
    برای رکورد آخر
    end;

  8. #8

    برای بدست آوردن فرزندان

    به راحتی می توان این کار را انجام داد اگر توجه کرده باشید پهلوی هر عنوان کد آن نوشته شده و می توانید بانک را بر حسب code_p برای فیلد Code_v فیلتر کنید
    filter:='code_p='+code_v

  9. #9
    کاربر دائمی آواتار cybercoder
    تاریخ عضویت
    فروردین 1387
    محل زندگی
    root/
    پست
    2,018
    ممنون از راهنماییتون ، من هم به این موضوع در آخر مقاله اشاره کردم ، ولی کمی خلاقیت هم بد نیست ...
    شَرمنده نمی دونم چرا ندیدمش!!!!!

    موفق باشید

  10. #10

    فقط یه چیز یادم رفته بود

    اینکه بعد از تغییر کد اصلی هر Parent متغییر Code_pe تمام فرزندان را باید یکی کرد(در ویرایش)

  11. #11

    مقاله ایینه ای کردن treeview

    نقل قول نوشته شده توسط vahidAM مشاهده تاپیک
    نگاهی به امضای آقای کرامتی بندازید فکر می کنم در مورد این کار مفید باشه.

    موفق باشید.
    با سلام من موفق نشدم این مقاله اقای کرامتی رو پیدا کنم میشه راهنمایی کنید کلا مشکل من با راست به چپ کردن treeview هست

  12. #12

    نقل قول: مقاله ایینه ای کردن treeview

    نقل قول نوشته شده توسط desinger2007 مشاهده تاپیک
    با سلام من موفق نشدم این مقاله اقای کرامتی رو پیدا کنم میشه راهنمایی کنید کلا مشکل من با راست به چپ کردن treeview هست
    يه نگاهي به اينجا بينداز فكر كنم اينجا باشه
    https://barnamenevis.org/showthread.php?t=59221

تاپیک های مشابه

  1. کار با Treeview !
    نوشته شده توسط rtech در بخش ASP.NET Web Forms
    پاسخ: 12
    آخرین پست: چهارشنبه 27 فروردین 1393, 01:17 صبح
  2. مشکل با TreeView
    نوشته شده توسط VisualStudio در بخش VB.NET
    پاسخ: 9
    آخرین پست: دوشنبه 02 شهریور 1388, 07:28 صبح
  3. انتخاب از TreeView
    نوشته شده توسط Ghalandari در بخش C#‎‎
    پاسخ: 2
    آخرین پست: سه شنبه 07 اسفند 1386, 17:08 عصر
  4. مشکل با TreeView
    نوشته شده توسط Alireza_Salehi در بخش ASP.NET Web Forms
    پاسخ: 4
    آخرین پست: دوشنبه 07 اسفند 1385, 20:43 عصر
  5. عدم نمایش Treeview
    نوشته شده توسط ar_monti@ در بخش ASP.NET Web Forms
    پاسخ: 2
    آخرین پست: پنج شنبه 12 بهمن 1385, 19:48 عصر

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

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