PDA

View Full Version : سوال: نحوه مرتبط کردن یک رویداد پراپرتی با یک متد



esafb52
جمعه 10 آبان 1392, 23:38 عصر
با سلام
فرض کنید من میخوام یه تکس باکس سفارشی بسازم و یه پراپرتی بهش اضافه کنم خب چطور کدش رو بنویسم که اگر پراپرتی تغییر کرد کدهای دلخواه من اجرا بشن مثلا یه خاصیت false اگر true شد و.....؟؟؟

علی متقی پور
شنبه 11 آبان 1392, 00:19 صبح
با سلام

توی قسمت SET پرارپتی بنویسید



public int _MyProperty;
public int MyProperty {
get
{
return 1;
}
set
{
//your Code
_MyProperty = value;
}
}

esafb52
شنبه 11 آبان 1392, 07:11 صبح
با سلام این رو بلدم منتها مشکل چیزی دیگه است اگه مثلا بخواهیم متن وارد شده بزرگ یا کوچک باشد باید رویداد مون در زمان اجرا هر لحظه عمل کنه انوقت چی? نمیتونیم که تو اون قسمت پراپرتی بیایم و یکی از متد های پایه رو اورراید کنیم
دوم اینکه چطور میشه من یه اونت رو به ایونت های یه کنترل در زمان دیزاین نسبت بدم
ممنون

learningtv.i
شنبه 11 آبان 1392, 15:31 عصر
منظورتون از انتساب event به eventکنترل چیه میشه دقیقتر توضیح بدید؟خیلی مبهم گفتید.

esafb52
شنبه 11 آبان 1392, 18:03 عصر
با سلام و تشکر از پاسختون
چون اون تایپیک مربوط به آموزش تون بود گفتم شلوغش نکنم و تایپیک ایجاد کردم !
من الان متوجه شدم که چطور یه event رو تعریف کنم (با دلیگیت قبلا آشنایی داشتم )
من چطور میتونم کاری کنم که بدون کدنویسی در زمان استفاده از اون کنترل سفارشی اگر پراپرتی upercase من true بود تکس حین تایپ متن بزرگ تایپ بشه یعنی رویداد من اجرا بشه؟؟(البته من اومدم متد
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
}
رو اورراید کردم ولی بعضی کلیدها از کار افتادن و..ولی کار کرد

و سوال دوم من چطور خودم میتونم یه event سفارشی بسازم و اون رو به لیست اجرای event های اون شی اضافه کنم که اگر مثلا من یه باتن ایجاد کردم سوای کدی که طرف تو رویداد کلیکش مینویسه کدهای من هم تو رویداد کلیکش اجرا بشه البته بدون کد نوییسی در زمان اجرا یعنی چطور میتونم کدهای یا eventهای خودم رو اجرا کنم
امیدوارم منظورم رو گفته باشم

learningtv.i
شنبه 11 آبان 1392, 19:12 عصر
سوال اول:
لازم به override کردن نبود مهندس.کافی بودن رویداد textChange رو اضافه کنی و در درون اون یک if قرار بدی که مقدار true بودن پراپرتی را چک کنه.خب هر لحظه که در تکست باکس چیزی وارد می کنی این رویداد فراخوانی می شه و اون If اجرا میشه حالا اگه در حین اجرا پراپرتی شما True شد شرط if صحیح هست و در داخل if میتونی حروف رو بزرگ کنی.

البته این کار که خیلی غیر منتطقی هست و اصول مهندسی نرم افزار رو درجا له می کنه.چون به ازای هر یک کاراکتر هی باید چک بشه که آیا پراپرتی تغییر کرده یا نه.اگه اون ویدئو را کامل ببنید کاری که ما کردیم و شما به علت و بی فایده بودنش انتقاد کردید بهتر هست.به جای این که در رویداد textchange هر بار بررسی کنیم یه event نوشتیم که فقط با تغییر پراپرتی و true شدنش اجرا و حروف رو تبدیل به Uppercase کنه نه هر بار TextChange رو برای هر یه کاراکتر فراخوانی کنیم و بگیم مثلا ما از event استفاده کردیم.



private void textBox1_TextChanged(object sender, EventArgs e)
{
if (Condition)
{
//make upper case
}
}


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

اما بریم سراغ جواب دقیق تر.
من به جای button شما همون ModernText در فیلم آموزشی را مثال می زنم.خب در ویدئو ما یه تابع به اسم OnIsUpperCaseChange نوشتیم که رویداد را فراخوانی می کرد خب بعد از فراخوانی در داخل همین تابع می توانیم کارهایی که دوست داریم انجام داده بشه مثلا من اینجا می خوام یه messageBox نمایش داده بشه.



protected void OnIsUpperCaseChange(object sender, ChangePropertyEventArgs e)
{
if (ChangeIsUpperCaseEvent != null)
{
//calling events
ChangeIsUpperCaseEvent(this, e);

MessageBox.Show("my work running");

}
}

حالا در دنباله ویدئو همون جایی که شما دقیقا یه عکس توی تاپیک به عنوان انتقاد گذاشته بودید مشاهده کردید که رفتیم به پنجره پراپرتی و کاربر همون رویداد را انتخاب کرد.الان این event پایین چیزی هست که کاربر ،کنترل سفارشی ما را روی فرم خود انداخته و این رویداد را از پنجره پراپرتی انتخاب و داخل اون چند تکه کد نوشته از جمله نمایش یک message-box.


private void modernTxtBox1_ChangeIsUpperCaseEvent(object sender, ModernTextBox.ChangePropertyEventArgs e)
{
MessageBox.Show(e.PropertyName);

if (e.OldProp == false)
{
modernTxtBox1.Text = modernTxtBox1.Text.ToUpper();
}
}

خب اگه به دو تکه کد بالا نگاه کنید دو تا message-box داریم اولی ما به عنوان برنامه نویس کنترل سفارشی نوشتیم و دومی را کاربر.وقتی رویداد کاربر اجرا می شه دو تا message-box نمایش داده می شه اول یکی خودش بعد یکی ما.
دقیقا همون چیزی که شما خواسته بودید.یعنی علاوه بر چیزی که کاربر اجرا می کنه موارد دلخواه ما هم به عنوان طراح کنترل سفارشی اجرا میشه فقط تفاوتش اینه شما گفتید button ما از همون modernTextBox فیلم آموزشی مثال زدیم.
اگه متوجه نشدید همین تغییرات را در سورس دانلود کردید بدید.اون وقت می بینید دو تا message-box نمایش داده میشه یکی کاربر ویکی ما به عنوان برنامه نویس.

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

esafb52
شنبه 11 آبان 1392, 22:26 عصر
با سلام و تشکر از پاسختون
چون دیر وقت هست فردا سعی میکنم مطالب این پست رو ویرایش کنم و بعدا کاملتر پاسخ دهید فعلا فقط برای این قسمت مثالی بزنید؟

ازم به override کردن نبود مهندس.کافی بودن رویداد textChange رو اضافه کنی و در درون اون یک if قرار بدی که مقدار true بودن پراپرتی را چک کنه.خب هر لحظه که در تکست باکس چیزی وارد می کنی این رویداد فراخوانی می شه و اون If اجرا میشه حالا اگه در حین اجرا پراپرتی شما True شد شرط if صحیح هست و در داخل if میتونی حروف رو بزرگ کنی.

learningtv.i
یک شنبه 12 آبان 1392, 05:08 صبح
خب این هم مثال:

private void textBox1_TextChanged(object sender, EventArgs e)
{
if (myProperty==true)
{
TextBox1.Text=TextBox.Text.UpperCase();
//یا از سترینگ فرمت استفاده کنید.
}
}

esafb52
یک شنبه 12 آبان 1392, 20:09 عصر
با سلام دوست عزیز من این رو بلدم ظاهرا نتونستم منظور خودم رو انتقال بدم
من اگر بخواهم تو یوزر کنترل سفارشی مثلا تکس باکس یه پراپرتی تعریف کنم و بخواهم مثلا اگر true بود یه متد یا event اجرا بشه بدون اینکه در زمان استفاده از اون یوزرکنترل سفارشی بخواهم کدی بنویسم(یعنی فقط با پراپرتی تو حالات دیزاین فقط کار کنم )باید چطور عمل کنم؟؟(شما الان تو رویداد textBox1_TextChanged کد نوشتین(البته کاری به اصول مهندسی نرم افزار هم ندارم!!)
2- من هنوز متوجه نشدم یه نکته رو
شما فکر کنید ما یه کلاس نوشتیم و دوست داریم از باتن ارث بری کنیم حالا من میخواهم یه تابع رو به یه ایونت کلیکش نسبت بدم باید چطور عمل کنم ؟

Mahmoud.Afrad
یک شنبه 12 آبان 1392, 23:54 عصر
میتونید متدی که این رویداد رو فراخوانی میکنه رو override کنید:

class CustomTextBox : TextBox
{
private bool _toUpperCase;
public bool ToUpperCase
{
get { return _toUpperCase; }
set { _toUpperCase = value; }
}

protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);

if (_toUpperCase)
{
this.Text = this.Text.ToUpper();
}
}
}

esafb52
دوشنبه 13 آبان 1392, 12:05 عصر
میتونید متدی که این رویداد رو فراخوانی میکنه رو override کنید:

class CustomTextBox : TextBox
{
private bool _toUpperCase;
public bool ToUpperCase
{
get { return _toUpperCase; }
set { _toUpperCase = value; }
}

protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);

if (_toUpperCase)
{
this.Text = this.Text.ToUpper();
}
}
}

با سلام و تشکر از پاسخ تون
من از این روش همونطورکه در پست بالا هم اشاره کردم

(البته من اومدم متد
protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);
}
رو اورراید کردم ولی بعضی کلیدها از کار افتادن و..ولی کار کرد
ولی باز خوب جواب نمیده مثلا مکان نما به قبل از کاراکترها برمیگرده و همچنین کلید بک اسپیس رو از کار میندازه

Mahmoud.Afrad
دوشنبه 13 آبان 1392, 18:43 عصر
اینجور چیزا رو خودت باید رفع کنی. سوال پرسیدن نداره

class CustomTextBox : TextBox
{
private bool _toUpperCase;
public bool ToUpperCase
{
get { return _toUpperCase; }
set { _toUpperCase = value; }
}

protected override void OnTextChanged(EventArgs e)
{
base.OnTextChanged(e);

if (_toUpperCase)
{
int index = this.SelectionStart;
int selectionLength = this.SelectionLength;
this.Text = this.Text.ToUpper();
this.SelectionStart = index;
this.SelectionLength = selectionLength;
}
}
}