کنترل FolderBrowserDialog

کنترل FolderBrowserDialog به شما اجازه می‌دهد که به دنبال یک فایل یا پوشه در داخل سیستم بگردید. این کنترل از یک نمایش درختی برای نمایش پوشه‌ها استفاده می‌کند. مرورگر این کنترل در حالت پیشفرض دسکتاپ و محتویات آن را نمایش می‌دهد. می‌توانید با کلیک بر روی فلش کوچکی که در کنار هر کدام از زیر مجموعه‌های دسک تاپ قرار دارد به زیرپوشه‌ها و فایل‌های آنها دست یافت (شکل زیر). همچنین می‌توان یک پوشه جدید در داخل پوشه انتخاب شده با استفاده از دکمه Make New Folder ایجاد کرد.
dialogs-02

در زیر برخی از خواص مفید کنترل FolderBrowserDialog آمده است:

خاصیت توضیح
Description به شما اجازه می‌دهد که یک متن توضیحی به بالای نمایش درختی FolderBrowserDialog اضافه کنید.
RootFolder یک پوشه را به عنوان پوشه اصلی کنترل نمایش می‌دهد. مثلاً دسکتاپ، پوشه اصلی و بقیه زیر پوشه.
SelectedPath پوشه یا مسیری که کاربر انتخاب کرده است.
ShowNewFolderButton نشان دادن یا مخفی کردن دکمه Make New Folder.

خاصیت Description به شما اجازه می‌دهد که یک توضیح به قسمت بالای نمایش درختی کادر محاوره‌ای کنترل اضافه کنید.
folderbrowserdialog-01
اگر نمی‌خواهید از دسک تاپ به عنوان ریشه اصلی استفاده نمایید (و بقیه پوشه‌ها زیر مجموعه آن باشند) می‌توانید از خاصیت RootFolder استفاده نمایید. در پنجره properties خاصیت RootFolder را یافته و بر روی دکمه drop down کناری آن کلیک کنید. در این صورت مسیرهای از پیش تعریف شده‌ای که می‌توانید آنها را انتخاب کنید، به شما نمایش داده می‌شود.
folderbrowserdialog-02
با استفاده از خاصیت SelectedPath می‌توان پوشه یا مسیر انتخاب شده را بدست آورد. مسیر به عنوان یک رشته برگردانده می‌شود. می‌خواهیم با یک مثال کارکرد کنترل FolderBrowserDialog را به شما نشان دهیم. برنامه‌ای که به عنوان مثال در نظر گرفته‌ایم، به کاربر اجازه می‌دهد که یک پوشه را انتخاب کرده و سپس مسیر آن را در داخل جعبه متن (text box) نمایش دهد. محتویات پوشه هم در داخل یک لیست باکس فهرست می‌شوند. یک فرم جدید مانند شکل زیر ایجاد کنید. و کنترل‌های button ،text box و listbox را در داخل آن قرار دهید.
folderbrowserdialog-03
از گروه Dialogs واقع در Toolbox کنترل FolderBrowserDialog را اضافه کنید. مشاهده می‌کنید که کنترل در قسمت پایینی محیط طراحی قرار می‌گیرد. بر روی دکمه Browse دو بار کلیک کرده و در داخل کنترل کننده رویداد آن کد زیر را بنویسید.

private void button1_Click(object sender, EventArgs e)
{   
    DialogResult result = folderBrowserDialog1.ShowDialog();

    if (result == DialogResult.OK)
    {
        //Show the path using the text box
        textBox1.Text = folderBrowserDialog1.SelectedPath;

        //Obtain information about the path
        DirectoryInfo selectedPath = new DirectoryInfo(textBox1.Text);

        //Clear the list box first 
        listBox1.Items.Clear();

        //Check if there are directories then add a label
        if (selectedPath.GetDirectories().Length > 0)
            listBox1.Items.Add("== Directories ==");

        //Show all the directories using the ListBox control
        foreach (DirectoryInfo dir in selectedPath.GetDirectories())
        {
            //Show only the name of the directory
            listBox1.Items.Add(dir.Name);
        }

        //Check if there are files then add a label
        if (selectedPath.GetFiles().Length > 0)
            listBox1.Items.Add("== Files ==");

        //Show all the directories using the ListBox control
        foreach (FileInfo file in selectedPath.GetFiles())
        {
            listBox1.Items.Add(file.Name);
        }
    }
}

این نکته فراموش نشود که لازم است در بالای کد فضای نام System.IO را وارد کنیم :

using System.IO;

ابتدا با استفاده از متد ()FolderBrowserDialog ،ShowDialog را فراخوانی می‌کنیم. حال کاربر می‌تواند یک پوشه را انتخاب کرده و دکمه OK را بزند. می‌توانید تست کنید که آیا کاربر دکمه OK را زده است یا نه؟ برای تشخیص اینکار می‌توانید یک مقدار را به وسیله متد ()ShowDialog برگشت دهید (خط 5). اگر کاربر دکمه OK را فشار داد سپس مسیر انتخاب شده توسط و در داخل جعبه متن نمایش داده شود.

 DirectoryInfo selectedPath = new DirectoryInfo(textBox1.Text);

این خط با استفاده از مسیر انتخاب شده توسط کاربر یک شیء از DirectoryInfo ایجاد می‌کند. شیء DirectoryInfo در داخل فضای نام System.IO قرار دارد و شامل خواصی است که، مشخص می‌کنند که مسیر پوشه انتخاب شده کجاست و محتویات آن چیست. چون با انتخاب یک مسیر یا پوشه زیر مجموعه‌های آن در داخل لیست باکس فهرست می‌شوند لازم است برای ورود آیتم‌های جدید لیست باکس پاک شود این کار را با استفاده از کد زیر انجام می‌دهیم.

 //Check if there are directories then add a label
if (selectedPath.GetDirectories().Length > 0)
     listBox1.Items.Add("== Directories ==");

//Show all the directories using the ListBox control
foreach (DirectoryInfo dir in selectedPath.GetDirectories())
{
    //Show only the name of the directory
    listBox1.Items.Add(dir.Name);
}

سپس چک می‌کنیم که آیا در داخل پوشه انتخاب شده پوشه‌های دیگری وجود دارند یا نه؟ این کار را با استفاده از خاصیت Length کلاس DirectoryInfo[] و برگرداندن مقدار بوسیله فراخوانی متد GetDirectoriesانجام می‌دهیم. اگر وجود داشت یک کنترل Lable ایجاد کرده و آن را به لیست باکسمان اضافه می‌کنیم. با استفاده از یک حلقه foreach و متد ()GetDirectories همه زیر پوشه‌های، پوشه جاری را می‌شماریم. سپس نام هر یک از زیر پوشه‌ها را به لیست باکس اضافه می‌کنیم.

//Check if there are files then add a label
if (selectedPath.GetFiles().Length > 0)
    listBox1.Items.Add("== Files ==");

//Show all the directories using the ListBox control
foreach (FileInfo file in selectedPath.GetFiles())
{
    listBox1.Items.Add(file.Name);
}

از تکنیک مشابهی برای نوشتن نام همه فایل‌های داخل یک پوشه انتخاب شده استفاده می‌کنیم. اما در اینجا ما از متد GetFiles و اشیاء کلاس FileInfoاستفاده می‌کنیم. شیء FileInfo شامل اطلاعات خاصی درباره یک فایل مشخص است. حال برنامه را اجرا کرده و یک پوشه انتخاب می‌کنیم. بر روی دکمه OK کلیک کرده تا برنامه، پوشه‌هایی را که در داخل پوشه انتخاب شده وجود دارند را به شما نشان دهد.