کنترلی برای ورود متن بی نیاز از برچسب




می خواهیم Textbox ی بسازیم که وقتی خالی است متنی را درون خود نشان میدهد و وقتی در آن اطلاعاتی وارد شود دیگر آن متن نمایش داده نشود. چیزی مثل textbox ی که برای جست و جو در سایت http://www.tebyan.net/ و در بالای صفحه وجود دارد. به این ترتیب توضیحاتی که معمولا به کمک Label در کنار textbox ها قرار میدهیم را به عنوان پیامی در داخل آنها جای میدهیم. در نتیجه نه تنها رابط گرافیکی کاربر ساده تر می شود، بلکه جلوه بهتری نیز دارد.

برای ساخت این کنترل به یک State Machine خیلی ساده نیاز داریم تا بین چهار وضعیت زیر سوئیچ کند:


0- آغاز
کنترل به عنوان  خالی علامت گذاری میشود و پیام دلخواه درون آن نمایش داده میشود

1- هنگام از دست دادن فوکس ( lostFocus )
باید بررسی شود که اگر کنترل خالی است پیام دلخواه نمایش داده شود.

2- هنگام بدست آوردن فوکس ( getFocus )
اگر کنترل خالی است، پس هم اکنون پیام دلخواه در حال نمایش است. پس باید این کنترل خالی شود
اگر کنترل خالی نیست، لازم نیست کاری انجام شود.

3- هنگام تغییر اطلاعات داخل کنترل توسط کاربر

گر کنترل خالی شد، به عنوان خالی علامت گذاری شود
اگر کنترل خالی نیست، به عنوان غیر خالی علامت گذاری شود.

نکته: چون وقتی در حال نوشتن پیام خالی بودن کنترل هستید، رویداد تغییر اطلاعات (3) صدا زده می شود از مکانیزمی برای ایجاد استثنا در این حالت استفاده میکنیم تا این متن به عنوان متنی که باعث تغییر وضعیت کنترل از خالی به پر می شود، شناخته نشود ( به کمک متغیر writtingEmptyMessage که نشان میدهد در حال نوشتن پیام خالی بودن هستیم ).

یک UserControl بسازید و یک textbox به آن اضافه کنید. حالا سه رویداد زیر را برای کنترل مدیریت میکنیم:
TextChanged
Leave
Enter
این هم کد کلاس UserControl:


public partial class UCSmartTextBox : UserControl
    {
        private bool isEmpty;
        private bool writtingEmptyMessage;
        private string emptymessage;

        public UCSmartTextBox()
        {
            InitializeComponent();

            emptymessage = "Textbox is empty ...";

            isEmpty = true;
            writtingEmptyMessage = true;
            textBox1.Text = emptymessage;
            writtingEmptyMessage = false;
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            if (textBox1.Text == "" || writtingEmptyMessage==true)
                isEmpty = true;
            else
                isEmpty = false;
        }

        private void textBox1_Enter(object sender, EventArgs e)
        {
            if (isEmpty == true)
                textBox1.Text = "";
        }

        private void textBox1_Leave(object sender, EventArgs e)
        {
            if (isEmpty == true)
            {
                writtingEmptyMessage = true;
                textBox1.Text = emptymessage;
                writtingEmptyMessage = false;
            }
        }
    }


دانلود نمونه سورس کد: