PDA

View Full Version : ساختن ایونت جدید برای یک کنترل



IMANAZADI
سه شنبه 28 دی 1389, 11:58 صبح
با سلام خدمت دوستان عزیز
اول از هر چی عرض کنم که تو انجمن ها و تاپیک ها سرچ کردم پیدا هم کردم اما اون چیزی که میخواستم نبود
میخواستم بدونم چطوری میشه یه event جدید واسه یک کنترل بنویسم . بطور مثال event های button را در نظر بگیرید شامل double click , click , mouse move , ... هست حالا میخوام یک ایونت جدید بنویسم که به این لیست events ها اضافه بشه یعنی تو لیست ایونت ها بتونم ببینمش و با دابل کلیک روی ایونت مورد نظر داخل اون اطلاعات بنویسم (مثل رویداد دابل کلیک)
بطور مثال : ایونت دابل راست کلیک

ممنون میشم کامل توضیح بدید (event , delegate)که هم من متوجه بشم هم اکثر دوستان که تو تاپیک های دیگه مشکل داشتند .

ASKaffash
سه شنبه 28 دی 1389, 13:02 عصر
سلام
فقط وراثت :


public delegate void MyClick();
[DefaultEvent("MyClick")]
public partial class NewButton : Button
{
public NewButton()
{
InitializeComponent();
}
public event MyClick MyClick;
}

احمد سامعی
سه شنبه 28 دی 1389, 17:48 عصر
فقط وراثت :

بسیار جواب خنده داری بود و بی ربط... البته ببخشید قصد توهین نداشتم

شما باید ابتدا یک delegate تعریف کنی


public delegate int PerformCalculation(int x, int y);
لینک منبع (http://msdn.microsoft.com/en-us/library/ms173171(VS.80).aspx)

PerformCalculation می تونه هر نامی باشه که شما می دی و بعد می رسیم به پارامترها، شما می تونی اون بدون پارامتر تعریف کنی یا کلاسی را به عنوان پارامتر بدی حتی می تونی از کلاس هایی که خودت تعریف کردی و در اون یک Property خواص ایجاد کردی استفاده کنی تا بعداً در event از اون استفاده کنی اینجا من برای مثال مقدار int گذاشتم

یا به صورت زیر

[SerializableAttribute]
[ComVisibleAttribute(true)]
public delegate void EventHandler (
Object sender,
EventArgs e

Parameters
sender
The source of the event.

e
An EventArgs that contains no event data.
منبع (http://msdn.microsoft.com/en-us/library/system.eventhandler(v=VS.80).aspx)

بعد می رسیم به تعریف خود event


public event EventHandler NoDataEventHandler;

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

private void OnNoDateEventHandler(Object sender, EventArgs e)
{
if(NoDataEventHandler!= null)
{NoDataEventHandler(sender, e);}
}
ارسال مقدار پارامت ها و چیزهای دیگه بسته به متد و event داره
حالا برای صدا زدن کافی هرجای که لازم متد OnNoDateEventHandler در کدهای کنترل فراخوانی کنی
مثال شما یک رکورد در بانک ذخیره می کنی بعد می خوای یک اتفاق بیفته مثلاً شماره رکورد به کاربر اعلام بشه شما در خط بعد از ایجاد رکورد در هر جایی که از برنامه هست OnNoDateEventHandler قرار می دی یا هرجای دیگه مثلاً می تونی پارامتر delegate یک int تعریف کنی مقدار ID جدید بازگشتی از ثبت رکورد به OnNoDateEventHandler پاس بدی، بعد در برنامه اصلی (خارج از کدهای کنترل زمانی که event فراخوانی می کنی) این مقدار دریافت کنی

هر جاش نفهمیدی بگو فکر کنم از این ساده تر نمی شه
اگر وقت کردم نمونه برنامه می زارم اما قول نمی دم

tooraj_azizi_1035
چهارشنبه 29 دی 1389, 10:40 صبح
سلام،
دوست من در اینجا نمونه کد مایکروسافت برای درک چگونگی ساخت یک EventHandler وجود داره:

// events1.cs
using System;
namespace MyCollections
{
using System.Collections;
// A delegate type for hooking up change notifications.
public delegate void ChangedEventHandler(object sender, EventArgs e);
// A class that works just like ArrayList, but sends event
// notifications whenever the list changes.
public class ListWithChangedEvent: ArrayList
{
// An event that clients can use to be notified whenever the
// elements of the list change.
public event ChangedEventHandler Changed;
// Invoke the Changed event; called whenever list changes
protected virtual void OnChanged(EventArgs e)
{
if (Changed != null)
Changed(this, e);
}
// Override some of the methods that can change the list;
// invoke event after each
public override int Add(object value)
{
int i = base.Add(value);
OnChanged(EventArgs.Empty);
return i;
}
public override void Clear()
{
base.Clear();
OnChanged(EventArgs.Empty);
}
public override object this[int index]
{
set
{
base[index] = value;
OnChanged(EventArgs.Empty);
}
}
}
}
namespace TestEvents
{
using MyCollections;
class EventListener
{
private ListWithChangedEvent List;
public EventListener(ListWithChangedEvent list)
{
List = list;
// Add "ListChanged" to the Changed event on "List".
List.Changed += new ChangedEventHandler(ListChanged);
}
// This will be called whenever the list changes.
private void ListChanged(object sender, EventArgs e)
{
Console.WriteLine("This is called when the event fires.");
}
public void Detach()
{
// Detach the event and delete the list
List.Changed -= new ChangedEventHandler(ListChanged);
List = null;
}
}
class Test
{
// Test the ListWithChangedEvent class.
public static void Main()
{
// Create a new list.
ListWithChangedEvent list = new ListWithChangedEvent();
// Create a class that listens to the list's change event.
EventListener listener = new EventListener(list);
// Add and remove items from the list.
list.Add("item 1");
list.Clear();
listener.Detach();
}
}
}

ListWithChangedEvent یک لیست است که مانند ArrayList است با این تفاوت که رویداد OnChanged را به رویدادهایی که به ارث برده اضافه کرده.
ساخت Event وابسته به درک مفهوم Delegate داره لینک زیر رو دنبال کن.
این لینک قدم به قدم مراحل رو توضیح می ده:http://msdn.microsoft.com/en-us/library/aa645739(v=vs.71).aspx

احمد سامعی
چهارشنبه 29 دی 1389, 23:18 عصر
میخواستم بدونم چطوری میشه یه event جدید واسه یک کنترل بنویسم . بطور مثال event های button را در نظر بگیرید .


برای شما متاسفم ! ولی اصلا سئوال اصلی را خوب نخوندید

ببخشید قصد مجادله و آف تاپیک هم ندارم اما جواب شما باید داده بشه!

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

ASKaffash
شنبه 02 بهمن 1389, 08:35 صبح
باسلام
نوع پاسخ شما نشانه فرهنگ شما در بحث فنی است لطف کنید و بحث فنی را ادامه دهید نه اینکه جملات ناشایست که در شان یک متخصص نیست را بنویسید

b.mahsa
شنبه 02 بهمن 1389, 11:06 صبح
با جنابASKaffash موافقم.
استفاده از Deligate ها در جاهي ديگه اي كاربرد داره.
دوست عزيز براي اضافا كردن Event به button تون بايد يه button شخصي بنويسيد و همون طور كه جناب ASKaffash گفتن . Event رو بهش اضافه كنيد.
فقط در تكميل صحبت دوستمون ASKaffash بايد به اين نكته دقت كنيد كه اول بايد يك كنترل اضافه كنيد و بعد اونن تكه كد رو براي كنترل بنويسيد

ASKaffash
شنبه 02 بهمن 1389, 11:29 صبح
سلام
اینهم کد شبیه سازی Click راست و چپ برای یک Button :


public delegate void NewClick(object sender, MouseEventArgs mevent);
public partial class MyButton : Button
{
public MyButton()
{
InitializeComponent();
}
[Category("My Event")]
[Description("Left Click")]
public event NewClick LeftClick;
[Category("My Event")]
[Description("Right Click")]
public event NewClick RightClick;
protected override void OnMouseDown(MouseEventArgs mevent)
{
if (mevent.Button ==MouseButtons.Right)
{
if (this.RightClick !=null)
this.RightClick(this, mevent);
}
elseif (mevent.Button ==MouseButtons.Left)
{
if (this.LeftClick !=null)
this.LeftClick(this, mevent);
}
}