کاربرد رویداد ها (Events) و توضیح کامل عملکرد آن ها در سی شارپ


دات وایت | DotWhite.ir
کاربرد رویداد ها (Events) و توضیح کامل عملکرد آن ها در سی شارپ

رویداد های Control

زماني كه يك كليد صفحه كليد را فشار مي دهيد يا ماوس را كليك ميكنيد، كنترل مرتبط يك رويداد براي نشان دادن عمل خاصي كه رخ داده است رها مي كند. يك رويداد ثبت شده، روالي كه به رويداد پاسخ مي دهد را اداره ميكند و آن عملي كـه بايد انجام گيرد را قانوني ميكند.

 اولين گام اداره كردن يك رويداد، تعيين نماينده منتسب شده به رويداد است . سپس بايد متد اداره كـردن رويـداد را بـا آن ثبت كنيد و مطمئن شويد نشانه متد با پارامترهاي مشخص شده نماينده تطابق دارد . جدول زیر اطلاعات مورد نيـاز بـراي كار با رويدادهاي رها شده ماوس و صفحه كليد را خلاصه ميكند.


اداره كردن رويدادهاي ماوس 

علاوه بر رويـدادهاي آشـناي Click و DoubleClick ،همـه كنتـرلهـاي فـرم وينـدوز، رويـدادهاي MouseHover و MouseEnter و MouseLeave را به ارث ميبرند. دو رويداد آخري زماني كه ماوس به محدوده ي يك كنترل وارد شـده يـا آن را ترك ميكند رها ميشوند. آنها براي ايجاد يك اثر Mouseover مفيد هستند كه براي صفحات وب معمول هستند. 

براي نشان دادن اين مطلب، مثالي كه زمان حركت ماوس روي كادر متن، رنگ پيش زمينه آن را تغيير مي دهد، ملاحظه كنيد. كد زير نمايندههايي براي فراخواني OnMouseEnter و OnMouseLeave جهت انجام تغيير رنگ پيش زمينه تنظيم ميكند.

TextBox userID = new TextBox();

userID.MouseEnter += new EventHandler(OnMouseEnter);

userID.MouseLeave += new EventHandler(OnMouseLeave);

متدهاي اداره كننده رويداد، نشانهي نماينده EventHandler را تطابق ميدهند و پارامتر sender را بـه نـوع Control براي دستيابي به خصوصيات آن قالببندي ميكند.

private void OnMouseEnter(object sender, System.EventArgs e)

 {

     Control ctrl = (Control)sender;

     ctrl.BackColor = Color.Bisque;

 }

private void OnMouseLeave(object sender, System.EventArgs e)

 {

     Control ctrl = (Control)sender;

     ctrl.BackColor = Color.White;

 }

اداره كردن رويدادها با override كردن ادارهكنندههاي رويداد پيشفرض كلاس پايه(Control (امكانپـذير اسـت. ايـن متدها با الگوي OnEventName نامگذاري ميشوند. در NET .مكانيزم نماينده، تعيين چندين ادارهكننده رويداد بـراي يـك رويداد را مجاز ميدارد و همچنين پردازش چندين رويداد توسط يك ادارهكنندهي رويداد منفرد را مجاز ميدارد.

نمايندههاي رويدادهاي MouseDown ،Mouseup و MouseMove به جاي آرگومان كلي EventArgs ،آرگومان دوم خـود را از نوع MouseEventArgs ميگيرند. اين نوع داده، اطلاعات حالت اضافي درباره ماوس را از طريق خـصوصيات نـشان داده شده در جدول زیر در اختيار قرار ميدهد. 

خصوصيات اين جدول عملاً براي برنامههايي كه بايد حركات ماوس را روي يك فرم دنبال كنند، مفيد هستند. مثـال معمـول برنامههاي گرافيكي هستند كه به موقعيت ماوس و دكمه براي كنترل ترسيم روي صفحه تكيه دارند . براي ارائه ايـن مطلـب، مثال زیر يك برنامه ترسيم ساده است كه يك خط روي فرم با شروع از محلي كه كليد ماوس فشار داده مي شود تا جـايي كه آن رها ميشود رسم ميكند. براي اينكه آن برنامه كمي جالب شود، اگر دكمه چپ را بكشيد خط سياه رسم مي كند و اگـر دكمه راست كشيده شود خط قرمز رسم ميكند. 

using System;

using System.Windows.Forms;

using System.Drawing;

    class MyWinApp

    {

        static void Main()

        {

            Form mainForm = new DrawingForm();

            Application.Run(mainForm);

        }

    }

    // User Form derived from base class Form

    class DrawingForm : Form

    {

        Point lastPoint = Point.Empty; // Save coordinates

        public Pen myPen; //Defines color of line

        public DrawingForm()

        {

            this.Text = "Drawing Pad";

            // reate delegates to call MouseUp and MouseDown

            this.MouseDown += new MouseEventHandler(OnMouseDown);

            this.MouseUp += new MouseEventHandler(OnMouseUp);

        }

        private void OnMouseDown(object sender, MouseEventArgs e)

        {

            myPen = (e.Button == MouseButtons.Right) ? Pens.Red :

            Pens.Black;

            lastPoint.X = e.X;

            lastPoint.Y = e.Y;

        }

        private void OnMouseUp(object sender, MouseEventArgs e)

        {

            // Create graphics object

            Graphics g = this.CreateGraphics();

            if (lastPoint != Point.Empty)

                g.DrawLine(myPen, lastPoint.X, lastPoint.Y, e.X, e.Y);

            lastPoint.X = e.X;

            lastPoint.Y = e.Y;

            g.Dispose();

        }

    }

حتي بدون فهم از گرافيك .NET ،نقش كلاسهاي گرافيكي مرتبط بايد بديهي باشد . يك شي Graphics از متد DrawLine براي انجام ترسيم واقعي استفاده ميكند. پارامترهاي اين متد، شي Pen و مختصات خط مورد نظر هستند . زماني كـه دكمـه فشرده ميشود، برنامه مختصات را ذخيره ميكند و myPen را براساس نوع دكمه فشار داده شده تنظيم مي كنـد(يـك قلـم قرمز براي دكمه راست و يك قلم سياه براي دكمه چپ ). زماني كه دكمهي ماوس رها ميشـود، خـط از مختـصات قبلـي بـه موقعيت جاري رسم ميشود. شي MouseEventArgs همه اطلاعات مورد نياز را براي انجام اين كار فراهم ميكند.


اداره كردن رويدادهاي صفحه كليد 

رويدادهاي صفحه كليد با تعريف يك نماينده براي فراخواني متد اداره كنندهي رويداد سفارشي اداره ميشوند. دو آرگومان به ادارهكنندهي رويداد ارسال ميشود. آرگومان sender شي رها كنندهي رويداد را مشخص ميكند و آرگومان دوم فيلـدهايي كه رويداد را توصيف ميكنند در بردارد. براي رويداد KeyPress آرگومان دوم از نوع KeyPressEventArgs اسـت. ايـن نوع داده، يك فيلد Handled دارد، كه با روال ادارهكننده رويداد true قرار داده ميشـود تـا تعيـين كنـد آن رويـداد را پردازش كرده است. خصوصيت ديگر KeyChar است كه كليد فشار داده شده را معين ميكند.

Keychar براي محدودكردن ورودي يك فيلد مفيد است. اين قطعه كد نشان ميدهد، محدودكردن ورودي يك فيلد به ارقام چقدر ساده است. زماني كه يك كاراكتر غيرعددي وارد مي شود، Handled به true تنظيم ميشـود كـه موتـور فـرم را ا ز نمايش كاراكتر منع ميكند. در غير اينصورت روال ادارهكنندهي رويداد، هيچ كاري انجام نمـيدهـد و كـاراكتر نمـايش داده ميشود.

private void OnKeyPress(object sender, KeyPressEventArgs e)

{

    if (!char.IsDigit(e.KeyChar)) e.Handled = true;

}

رويداد KeyPress فقط براي كليدهاي كاراكتري قابل چاپ رها مي شود. آن كليدهاي غيركاراكتري همچـونAlt و Shift را صرفنظر ميكند. آن رويداد، همه ضربه هاي كليدها را تشخيص ميدهـد و بـراي شـروع رويـدادهاي KeyDown و KeyUp ضروري است. ادارهكنندههاي رويدادهاي مربوطه، يك پارامتر از نوع KeyEventsArgs دريافت ميكنند كـه ضـربه كليـد تكي يا ضربه تركيب كليدها را تشخيص مي دهد. جدول زیر خصوصيات مهم فـراهم شـده بوسـيله KeyErentsArgs را ليست ميكند.

به چند مورد توجه كنيد: 

 - خصوصيات Alt ،Control و Shift ،ميانبرهاي سـادهاي بـراي مقايـسه مقـدار KeyCode بـا اعـضاي Alt، Control يا Shift از نوع شمارشي Keys هستند.

 - KeyCode مقدار يك كليد تك را نشان ميدهد. KeyData يك مقدار براي كليد تكي يا تركيبي از كليدهاي فشار داده شده را در بردارد.

 - نوع شمارشي Keys ،به تشخيص كليدها محرمانه است، چون اعضاي آن همه كليدها را نشان مي دهد. اگر NET.VS را بكار ميبريد، زماني كه نوع شمارشي Keys در يك حالت متشابه استفاده شود، سيستم هوشمند همـه اعـضاي آن را ليست ميكند. براي مثال ارقام با 1D و 2D و غيره نمايش داده مي شوند.

قطعه كد قبلي نشان ميدهد، چگونه KeyPress را بكار بريم تا مطمئن شويم يك كـاربر فقـط كليـدهاي عـددي را فـشار ميدهد. با اين وجود از چسباندن (Paste (داده هاي غيرعددي به كمك كليـد تركيبـي V+Ctrl جلـوگيري نمـيكنـد. بـا استفاده از رويداد KeyDown ميتوان اين كليد تركيبـي را تـشخيص داد، تـا بـا تنظـيم يـك پـرچم، اداره كننـده رويـداد KeyPress را راهنمايي كند تا تلاش براي چسباندن را صرف نظر كند.

 در اين مثال دو ادارهكننده رويداد ثبت ميشود تا در زمان وارد كردن داده ها از طريق صفحه كليـد فراخـواني شـوند . ابتـدا KeyDown احضار ميشود و اگر كاربر كليد تركيبي V+Ctrl را فشار دهد، مقدار Paste را true قرار ميدهد. اداره كننده ي رويداد KeyPress اين پرچم را براي تعيين اينكه آيا ضربه هاي كليد را بپذيرد بكار ميبرد.

private void Form1_Load(object sender, EventArgs e)

{

    TextBox userID = new TextBox();

    userID.MouseEnter += new EventHandler(OnMouseEnter);

    userID.MouseLeave += new EventHandler(OnMouseLeave);

}

 

private bool paste;

//Register event handlers for TextBox t.

//They should be registered in this order,

//because the last registered is the

//first executed

t.KeyPress += new KeyPressEventHandler(OnKeyPress);

t.KeyDown += new KeyEventHandler(OnKeyDown);

private void OnKeyDown(object sender, KeyEventArgs e)

{

    if (e.Modifiers == Keys.Control && e.KeyCode == Keys.V)

    {

        paste = true//Flag indicating paste attempt

        string msg = string.Format("Modifier: {٠} nKeyCode: {١} nKeyData: {٢}",

            e.Modifiers.ToString(), e.KeyCode.ToString(), e.KeyData.ToString());

        MessageBox.Show(msg); //Display property values

    }

private void OnKeyPress(object sender, KeyPressEventArgs e)

{

    if (paste == true) e.Handled = true;

}

اين برنامه مقادير زير را براي خصوصيات انتخاب شده از KeyEventArge در حين فشار دادن V+Ctrl نمايش ميدهد.

Modifier: Control

KeyCode: V

KeyData: Control, V

کلاس Form

كلاس Form همهي اعضاي كلاس Control را همانند ScrollableControl)،كه خصوصياتي فراهم ميكند تا قـادر بـه لغزاندن باشد) ارثبري ميكند. بدين علت تعداد زيادي خصوصيات براي كنترل ظاهر فرم، كار بـا فـرم هـاي فرزنـد، ايجـاد فرمهاي Modal ،نمايش منوها و تعامل با ميزكار از طريق نوارهاي حالت و ابزار اضافه مي كند. جدول زیر ليست انتخـابي از اين خصوصيات را نشان ميدهد.

منبع : دات وایت



تاریخ انتشار : پنجشنبه 16 دي 1395 ساعت: 10:59 | نظرات()
برچسب ها : , , , , , , , , , , , , , , , , , , , ,

نویسنده :

بازديد : 558

موضوع: سی شارپ , کد های مفید ,

بخش نظرات این مطلب
نام
ایمیل (منتشر نمی‌شود) (لازم)
وبسایت
:) :( ;) :D ;)) :X :? :P :* =(( :O @};- :B /:) :S
نظر خصوصی
مشخصات شما ذخیره شود ؟ [حذف مشخصات] [شکلک ها]
کد امنیتیرفرش کد امنیتی