کنترل TreeView

کنترل treeView برای نمایش درختی آیتم‌ها به کار می‌رود. برای درک بهتر عملکرد این کنترل می‌توان به فهرست مطالب یک کتاب و یا نمایش فایل‌ها و یا پوشه‌های درون هارد اشاره کرد. هر آتیم در این کنترل شامل یک برچسب و یک عکس اختیاری است و هر آیتم خود می‌تواند شامل زیر آیتم‌های دیگر باشد. با کلیک بر روی علامت + یا – کنار هر آیتم، کاربر می‌تواند زیر آیتم‌های مربوطه را مشاهده کند. در شکل زیر یک کنترل treeview ساده با چند آیتم نمایش داده شده است. همانطور که مشاهده می‌کنید آیتم Root آیتم یا گره اصلی است که دارای دو زیر آیتم به نام‌های NodeA و NodeB می‌باشد. NodeA نیز به نوبه خود دارای دو زیر آیتم به نام‌های ChildA و ChildB است.
Treeview

بعد از ایجاد treeView می‌توان هر یک از آیتم‌های آن را دستکاری کرد (حذف، اضافه، ویرایش و مرتب کرد). در زیر به برخی از خاصیت‌ها، متدها و رویدادهای مهم این کنترل اشاره شده است :

خاصیت توضیح
CheckBox یک جعبه تیک یا چک باکس در کنار هر گره نمایش می‌دهد.
ItemHeight ارتفاع گره‌های کنترل را مشخص می‌کند.
LabelEdit مشخص می‌کند که آیا متن گره‌ها قابل ویرایش باشد یا نه؟
LineColor رنگ خطی که به گره‌ها متصل است را مشخص می‌کند.
Nodes مجموعه‌ای از گره‌های کنترل را بر می‌گرداند.
Scrollable مشخص می‌کند که آیا کنترل دارای اسکرول باشد یا نه؟
SelectedImageIndex مقدار اندیس عکسی که قرار است هنگام انتخاب گره، در کنار گره نمایش داده شود، را نمایش می‌دهد.
SelectedNode گره جاری انتخاب شده در کنترل را مشخص می‌کند.
ShowLines مشخص می‌کند که آیا خط ارتباط دهنده بین گره‌ها، نمایش داده شود یا خیر؟
ShowNodeToolTips مشخص می‌کند که آیا هنگام مکث ماوس بر روی گره‌ها متنی نمایش داده شود یا نه؟
ShowPlusMinus مشخص می‌کند که آیا علائم + و منفی در کنار گره‌ها نمایش داده شوند یا نه؟
ShowRootLines مشخص می‌کند که آیا خط زیر گره اصلی، نمایش داده شود یا خیر؟
Sorted مشخص می‌کند که آیا گره‌ها در داخل کنترل مرتب نمایش داده شوند یا نه؟
TreeViewNodeSorter با پیاده سازی اینترفیس IComparer اجازه می‌دهد که گره‌ها را به صورت سفارشی مرتب سازی کنید.
متد توضیح
CollapseAll همه گره‌های باز شده را جمع می‌کند.
ExpandAll همه گره‌های بسته شده را باز می‌کند.
GetNodeCount تعداد تمامی گره‌ها و زیر گره‌های کنترل را بر می‌گرداند.
رویداد توضیح
AfterCheck بعد از تیک خوردن جعبه کنار گره، روی می‌دهد.
AfterCollapse بعد از بسته شدن گره‌ها، روی می‌دهد.
AfterExpand بعد از باز شدن گره‌ها روی می‌دهد.
AfterLabelEdit بعد از ویرایش متن گره‌ها روی می‌دهد.
AfterSelect بعد از انتخاب یک گره روی می‌دهد.
BeforeCheck قبل از تیک حوردن یک گره روی می‌دهد.
BeforeCollapse قبل از بسته شدن یگ گره روی می‌دهد.
BeforeExpand قبل از باز شدن یک گره روی می‌دهد.
BeforeLabelEdit قبل از ویرایش متن یک گره روی می‌دهد.
BeforeSelect قبل از انتخاب یک گره روی می‌دهد.
NodeMouseClick وقتی روی می‌دهد که بر روی یک گره کلیک شود.
NodeMouseDoubleClick وقتی روی می‌دهد که بر روی یک گره دو بار کلیک شود.
NodeMouseHover وقتی روی می‌دهد که با ماوس بر روی یک گره برویم.

برای اضافه کردن آیتم یا گره به یک کنترل treeView می‌توان به دو روش عمل کرد :

  • استفاده از پنجره Properties
  • استفاده از کدنویسی

ابتدا روش اول را توضیح می‌دهیم. یک کنترل treeView بر روی فرم قرار داده و آن را در حالت انتخاب قرار دهید. سپس در پنجره Properties بر روی دکمه‌ای که در خاصیت Nodes قرار دارد کلیک کنید. بعد از کلیک، پنجره‌ای به صورت زیر باز می‌شود که شما می‌توانید با استفاده از آن، گره‌های لازم را به کنترل treeView اضافه کنید. فرض کنید می‌خواهیم گره‌های شکل بالا را ایجاد کنیم. ابتدا به صورت زیر گره اصلی (Root) را ایجاد و نام گذاری می‌کنیم :

Treeview-1
Treeview-2
Treeview-3

بعد از ایجاد گره اصلی، برای اضافه کردن دو زیر گره ابتدا بر روی گره اصلی کلیک کرده و سپس دو بار کلیک بر روی دکمه add Child دو زیر گره به آن اضافه می‌کنیم :
Treeview-4

برای اضافه کردن یک زیر گره به گره جدید ایجاد شده هم ابتدا بر روی آن کلیک کرده و سپس دکمه add Child را می‌زنیم.

Treeview-5

به این نکته توجه کنید که برای اضافه کردن یک زیر گره، حتماً باید گره‌ای که قرار است یک زیر گره به آن اضافه شود در حالت انتخاب باشد. برای حذف گره‌های اضافی و ناخواسته و همچنین جابه جایی گره‌ها از دکمه‌های زیر استفاده می‌شود :

Treeview-6

برای اینکه در کنار هر گره یک جعبه متن قرار دهیم می‌توانیم از خاصیت CheckBoxes در پنجره Properties استفاده کرده و مقدار آن را برابر True قرار دهیم:
5-22-2015 5-21-57 PM

اگر بخواهیم یک عکس به گره‌ها اختصاص دهیم، ابتدا باید یک کنترل imageList بر روی فرم بکشیم و سپس با استفاده از خاصیت Image این کنترل عکسی را که می‌خواهیم انتخاب کنیم :

Treeview-7

Treeview-8

در مرحله بعد بر روی کنترل treeView کلیک کرده و از خاصیت ImageList آن را بر روی نام کنترل imageList اضافه شده به فرم قرار می‌دهیم تا عکس به گره‌ها اضافه شود :

Treeview-9

Treeview-10

حال همین مراحل بالا را می‌خواهیم با استفاده از روش کدنویسی انجام دهیم. یک برنامه ویندوزی ایجاد کرده و یک کنترل treeView بر روی فرم قرار دهید. سپس مثلاً بر روی فرم دو بار کلیک کرده و کد زیر را بنویسید :

treeView1.Nodes.Add("Root");

با اجرای برنامه مشاهده می‌کنید که گره اصلی به فرم اضافه شده است :
Treeview-11

برای اضافه کرده دو زیر گره به این گره اصلی هم به صورت زیر عمل می‌کنید :

treeView1.Nodes[0].Nodes.Add("NodeA");
treeView1.Nodes[0].Nodes.Add("NodeB");

عدد صفر در کد بالا، اندیس گره اصلی (Root) است :
Treeview-12

و برای اضافه کردن زیر گره به گره NodeA به صورت زیر عمل می‌کنیم :

treeView1.Nodes[0].Nodes[0].Nodes.Add("ChildA");
treeView1.Nodes[0].Nodes[0].Nodes.Add("ChildB");

همانطور که در کد بالا مشاهده می‌کنید اولین صفر نشان دهنده اندیس گره Root و دومین صفر نشان دهنده اولین زیر گره آن یعنی NodeA است:
Treeview-13

از کدهای بالا نتیجه می‌گیریم که برای اضافه کردن یک زیر گره، به گره NodeB، باید به جای عدد 0، عدد 1 قرار دهیم :

treeView1.Nodes[0].Nodes[1].Nodes.Add("ChildA");

Treeview-14

در کل کدهای زیر گره‌های شکل بالا را به وجود می‌آورند :

using System.Windows.Forms;

namespace TreeView
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
           //گره اصلی
            treeView1.Nodes.Add("Root");

            //اولین زیر گره، گره اصلی و زیر گره‌های آن
            treeView1.Nodes[0].Nodes.Add("NodeA");
            treeView1.Nodes[0].Nodes[0].Nodes.Add("ChildA");
            treeView1.Nodes[0].Nodes[0].Nodes.Add("ChildB");

            //دومین زیر گره، گره اصلی و زیر گره‌های آن
            treeView1.Nodes[0].Nodes.Add("NodeB");          
            treeView1.Nodes[0].Nodes[1].Nodes.Add("ChildA");                        
        }
    }
}

برای حذف یک گره هم می‌توانیم از متد ()Remove استفاده کنیم. مثلاً اگر بخواهیم گره NodeA را حذف کنیم، به صورت زیر عمل می‌نماییم :

treeView1.Nodes[0].Nodes[0].Remove(); 

همانطور که مشاهده می‌کنید اندیس گره را به صورت بالا نوشته و بعد متد ()Remove را فراخوانی می‌کنیم. به این نکته توجه کنید که، با حذف یک گره مادر، تمام زیر گره‌های آن هم حذف می‌شوند :
Treeview-15
مطمئناً تاکنون متوجه شده‌اید که برای حذف مثلاً زیر گره ChildA باید به صورت زیر، سلسه مراتب وراثتی آن را رعایت کنیم :

treeView1.Nodes[0].Nodes[0].Nodes[0].Remove(); 

در کد بالا به ترتیب از چپ به راست، صفر اول اندیس گره Root، صفر دوم اندیس گره NodeA و صفر آخر هم اندیس ChildA است :
Treeview-16