PDA

View Full Version : حرفه ای: اجرای یک رویداد در هنگام تغییر خواصیت در یک کامپوننت



navidiran
دوشنبه 10 تیر 1392, 11:01 صبح
سلام دوستان این کد مربوط به ایجاد یک خواصیت جدید در کامپوننت دلخواه خودم است. هدف این است که با تغییر خواصیت متدی اجرا شود. من راه دیگری غیر از اینکه در تنظیمات set متد اجرا شود را پیدا نکردم . آیا راه دیگری هست ؟ خلاصه اینکه بصورت زیر نوشتم:


public enum ButtonMode
{
Function ,
Select ,
Large ,
Mini
}
public ButtonMode ModeSelect
{
get { return 0;}d

set
{
if ( value == ButtonMode.Function )
{
this.Size = new System.Drawing.Size( 100 , 50 );
}
else
if ( value == ButtonMode.Select )
{
this.Size = new System.Drawing.Size( 50 , 50 );
}
}
}


الان من در متد get که با رنگ سبز مشخص کردم چی بنویسم که جواب بگیرم و متد get کار کنه؟
البته دوستان حرفه ای میدونم که پیش خودشون میگن که من هنوز مفهوم get رو یاد نگرفتم ، بله درسته اما اینجا میخوام کمی جنبه آموزشی هم داشته باشه.
ممنون میشم کسی راهنمایی کنه و البته در مورد همین get , set هم توضیح مختصر و مفید دیگری هم بدین ممنون میشم.

hamid_hr
دوشنبه 10 تیر 1392, 11:41 صبح
من برا اضافه كردن رويداد به كومپوننت كه ساختم اين كار كردم
اول داخل كد كمپوننت

public event EventHandler Delete;
public void OnDelete()
{
EventHandler Tmp = Delete;
if (Tmp != null) Tmp(this, EventArgs.Empty);
}


حالا ميام يه دكمه ميزادم روي كومپوننت مثلا به نام delete
داخل رويداد كليكش اينو مينويسم

Delete(this, EventArgs.Empty);


حالا روي فرمم كه از كومپوننت استفاده كردم اين كارو ميكنم


MyComponent tmp = new MyComponent();
tmp.Delete += new EventHandler(tmp_Delete);

void tmp_Delete(object sender, EventArgs e)
{
//كدهاي كه ميخواهيم با اجراي اين رويداد اجرا شوند
}



حالا با كليك بر روي دكمه delete كومپوننت اين كدهاي شوا كه تو فرمت نوشتي اجرا ميشن

navidiran
دوشنبه 10 تیر 1392, 11:52 صبح
اینها همه تعریف و تنظیم رویداد روی کامپوننت هستن که بعد از انجام کاری روی کامپوننت اجرا میشوند ولی من میخوام با تغییر یک خواصیت (property) ، رویداد خودکار اجرا بشه مثلا تغییر سایز.

hamid_hr
دوشنبه 10 تیر 1392, 12:08 عصر
خب شما بجاي ايجاد دكمه delete و نوشتن اون يك خط كد بيا اون كد رو تو رويداد sezechenged بزار
با اين كار وقتي سايز كمپوننتت تغيير كرد اون كدها اجرا ميشه

Mahmoud.Afrad
دوشنبه 10 تیر 1392, 13:57 عصر
باید رویداد یا متد رو در setter پراپرتی فراخوانی کنی.

navidiran
دوشنبه 10 تیر 1392, 18:40 عصر
باید رویداد یا متد رو در setter پراپرتی فراخوانی کنی.

این راه درست است. فقط چگونگی این کار رو هنوز نتونستم حل کنم. کسی میتونه یه راهنمایی اولیه داشته باشه ؟
البته با تشکر از hamid_hr (http://barnamenevis.org/member.php?25531-hamid_hr)

Mahmoud.Afrad
دوشنبه 10 تیر 1392, 19:08 عصر
نمیدونم مشکل چیه. طبق کدی که در پست1 گذاشتی در set متد را فراخوانی کن یا رویداد را raise کن یا مستقیم تغییر سایز بده، شرط بنویس یا هر کدی که میخوای با ست شدن پراپرتی انجام بشه.

class MyClass
{
private int a;
public int A
{
get { return a; }
set
{
a = value;
ChangeSize(); // raise event
}
}

private void ChangeSize()
{
// ...
}
}

اگر هم میخوای فقط زمانی که مقدار جدید با مقدار قبلی متفاوت بود تغییر سایز انجام بشه value را با مقدار قبلی مقایسه کن.(برای این کار یک متغیر خصوصی برای هر پراپرتی نیازه). فراخوانی رو به اینصورت اصلاح کن:

if (a != value)
{
a = value;
ChangeSize(); // raise event
}