PDA

View Full Version : ایجاد یک رویداد در سی شارپ



amin_sltny
شنبه 24 فروردین 1392, 17:00 عصر
سلام بچه ها

آیا میشه رویدادی درست کرد که مثلا اگر مقدار متغیری عوض شد یه عمل انجام بشه؟ اگه میشه چه طوری؟

با تشکر

وبم (http://kanonportal.ir)

amin_sltny
شنبه 24 فروردین 1392, 17:43 عصر
به چه صورت مقدار متغیر تغییر میکنه. کد تغییر مقدار رو بزارید.

خب مقدار متغیر را عوض می کنیم دیگه مثلا داریم:


string str="Hello";


بعد یه جا از برنامه یا توی یه کلاس دیگه مقدار متغر به شرح زیر عوض میشه:

str="by";


حالا می خواهیم به محض اینکه مقدار این متغیر عوض میشه مثلا خارج بشه

Mahmoud.Afrad
شنبه 24 فروردین 1392, 18:17 عصر
ببینید برای اینکه در صورت تغییر مقدار، کار خاصی اتفاق بیفته کافیه اون عمل را در setter پراپرتی فراخوانی کنید و یا یک رویداد را raise کرد که میتونه رویدادی باشه که خدتون تعریف کردید یا از رویداد های PropertyChangingEventHandler و PropertyChangedEventHandler استفاده کنید.
پیاده سازی:
ابتدا یک پراپرتی به کلاس اضافه کنید از همان نوع متغیر.
سپس کافیه یک رویداد از هر کدام از انواع PropertyChangingEventHandler و PropertyChangedEventHandler ایجاد کنید. فراخوانی هر کدام از این دو رویداد را در متدی انجام دهید. و متدها را قبل و بعد از تغییر مقدار در setter فراخوانی کنید.
برای آنکه هیچ چیز را فراموش نکنید میتوانید کلاس خود را از دو اینترفیس INotifyPropertyChanging, INotifyPropertyChanged ارث بری کنید تا مجبور باشید این خاصیت ها را پیاده کنید.
مثال:

using System.ComponentModel;

public class MyClass : INotifyPropertyChanging, INotifyPropertyChanged
{
private string myVariable;
public string MyProperty
{
get { return myVariable; }
set
{
if (value != myVariable)
{
OnMyPropertyChanging();
myVariable = value;
OnMyPropertyChanged();
}
}
}

public event PropertyChangingEventHandler PropertyChanging;
virtual protected void OnMyPropertyChanging()
{
if (PropertyChanging != null)
{
PropertyChanging(this, new PropertyChangingEventArgs("MyProperty"));
}
}

public event PropertyChangedEventHandler PropertyChanged;
virtual protected void OnMyPropertyChanged()
{
if (PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("MyProperty"));
}
}
}


طریقه استفاده هم که فرقی نداره:

private void button2_Click(object sender, EventArgs e)
{
MyClass m = new MyClass();
m.PropertyChanging += new PropertyChangingEventHandler(m_PropertyChanging);
m.PropertyChanged +=new PropertyChangedEventHandler(m_PropertyChanged);
m.MyProperty = "aaa";
}

void m_PropertyChanging(object sender, PropertyChangingEventArgs e)
{
MessageBox.Show("before");
}

void m_PropertyChanged(object sender, PropertyChangedEventArgs e)
{
MessageBox.Show("after");
}

amin_sltny
شنبه 24 فروردین 1392, 18:53 عصر
کد ها رو امتحان می کنم و بعد اگه جایی اشکال داشتم می پرستم فقط در مورد این چند کیمه اگه میشه توضیح بدید که چیند.

setter و ایترفیس و virtual protected .

با تشکر