PDA

View Full Version : منظور از sender چیست؟ (در تابع)



ordebehesht
یک شنبه 08 بهمن 1391, 13:00 عصر
با سلام یکی بهم بگه این دوتا sender چه میکنن تو این ر.یداد


private void ChooseImagesClick(object sender, EventArgs e)
{
RadMenuItem item = (sender as RadMenuItem);
ddbImages.Image = ((Image)item.Tag).GetThumbnailImage(20, 20, null, new IntPtr());
ddbImages.Text = item.Text;
ddbImages.TextImageRelation = TextImageRelation.ImageBeforeText;
pictureBox1.Image = (Image)item.Tag;
}

fakhravari
یک شنبه 08 بهمن 1391, 13:45 عصر
sender رویداد های رخ داده هستند .
مثل کلیک و ...
که میتوان مقادیر از آن گرفت.

ordebehesht
یک شنبه 08 بهمن 1391, 14:02 عصر
منظورم این خط بود

RadMenuItem item = (sender as RadMenuItem);

مهرداد صفا
یک شنبه 08 بهمن 1391, 14:21 عصر
سلام
sender در اینجا همان radMenuItem ای است که روی آن کلیک شده و چون در اینجا به صورت object، box شده، به عنوان RadMenuItem در نظر گرفته (تبدیل) می شود و به item نسبت داده میشود.

ordebehesht
یک شنبه 08 بهمن 1391, 14:39 عصر
چی ارسال میکنه

مهرداد صفا
یک شنبه 08 بهمن 1391, 14:59 عصر
چی ارسال میکنه

رویداد را!

ordebehesht
یک شنبه 08 بهمن 1391, 15:13 عصر
کجا مورد استفاده قرار میگیره

plus
یک شنبه 08 بهمن 1391, 15:55 عصر
هنگامی که یک رویداد توسط یک شی Raise میشه، معمولا شی تولید کننده رویداد، به عنوان اولین آرگومان به صورت object و با اسم sender به Handler اون رویداد ارسال میشه.مثلا فرض کنید شما 2 دو تا دکمه دارین ولی برای رویداد کلیک هر دو فقط یک Handler نوشته باشید.خوب، وقتی هر کدوم ازین دکمه ها کلیک بشه، همون Handler فراخوانی میشه (Raise میشه).حالا شما که قراره توی Handler کد بنویسی (مثلا بر اساس اینکه کدوم دکمه کلیک شده یک پیغام بدی)، از کجا باید بفهمی کدوم دکمه کلیک شده؟ از sender.ازونجایی که شما هدنلر رو برای دکمه نوشتین، پس Sender از نوع دکمه هست، اون رو باید cast کد (و یا از as استفاده کرد) و بعد شما به شی تولید کننده رویداد دسترسی پیدا میکنی.

public Form1()
{
InitializeComponents();
button1.Click += new EventHandler(button_Click);
button2.Click += new EventHandler(button_Click);
}

public void button_Click(object sender, EventArgs s)
{
Button clickedButton = sender as Button; // OR : (Button)sender
MessageBox.Show(clickedButton.Name + " was clicked!");
}

این کد، با یک هندلر برای دو دکمه، از روی sender تشخیص میده کدوم دکمه کلیک شده.

ordebehesht
یک شنبه 08 بهمن 1391, 17:05 عصر
میشه یه نمونه مثال برام بزارین تا کارش رو ببینم مفهومش رو گرفتم ولی....

plus
یک شنبه 08 بهمن 1391, 18:40 عصر
مثال رو که گذاشتم، کدی که خودتون گذشتین هم یک مثال هست برای این موضوع: وقتی بخوایم به ازای روی دادن یک رویداد از شی های مختلف ساخته شده از یک کلاس، یک کد مشترک رو اجرا کنیم.
مثلا در کدی که خودتون گذاشتین، برای رویداد کلیک تعدادی از RadMenuItem ها، فقط یک EventHandler تعریف شده، چون عملی که وقتی یک منو آیتم کلیک میشه انجام میشه یکسانه، فقط یک سری پارامتر های مربوط به آیتم کلیک شده دخیل هستن.مثلا، در این کد، مشخصه tag آیتمی که کلیک شده به picturebox نسبت داده میشه.

private void ChooseImagesClick(object sender, EventArgs e)
{
RadMenuItem item = (sender as RadMenuItem);
ddbImages.Image = ((Image)item.Tag).GetThumbnailImage(20, 20, null, new IntPtr());
ddbImages.Text = item.Text;
ddbImages.TextImageRelation = TextImageRelation.ImageBeforeText;
pictureBox1.Image = (Image)item.Tag;
}

بجای ایکه بیایم برای هر آیتم یک EventHandler بنویسیم که توی هر کدوم، مشخصه tag اون آیتم رو به picturebox نسبت بدیم، فقط 1 دونه EventHandler مینویسیم، بوسیله آرگومان Sender میفهمیم کدوم آیتم کلیک شده، و tag اون آیتم رو به picturebox نسبت میدیم.