PDA

View Full Version : سوال: رویدادنویسی در windows form control



kebriya
جمعه 24 مهر 1394, 15:11 عصر
سلام دوستان.من ی dll با windows form control ساختم که توش ی تکست باکس و یه لیبل داره.من میخام به dll خودم ی رویداد textchenged اضافه کنم .چون dll ساخته شده من در پروژه ها مثل یک پنل عمل میکنه.برا همین باید خودم بش ی چیزایی رو اضافه کنم.الان فقط میخام رویداد textchanged تکست باکسو براش بنویسم.میشه کمکم کنید نوشتن رویداد چجوریه؟؟

Mahmoud Zaad
شنبه 25 مهر 1394, 09:52 صبح
سلام
کد زیر رو به صورت سراسری تعریف کنید:
public event EventHandler<EventArgs> ControlTextChanged;

حالا در رویداد textChanged تکست باکس در یوزر کنترل کدهای زیر رو بنویسید:
var textChanged = ControlTextChanged;
if (textChanged != null)
ControlTextChanged(textBox1, null);

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

همه کدها:
using System;
using System.Windows.Forms;

namespace VariousControls
{
public partial class UserControl1 : UserControl
{
public event EventHandler<EventArgs> ControlTextChanged;

public UserControl1()
{
InitializeComponent();
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
var textChanged = ControlTextChanged;
if (textChanged != null)
ControlTextChanged(textBox1, null);
}
}
}

winner1
شنبه 25 مهر 1394, 10:15 صبح
سلام
کد زیر رو به صورت سراسری تعریف کنید:
public event EventHandler<EventArgs> ControlTextChanged;

حالا در رویداد textChanged تکست باکس در یوزر کنترل کدهای زیر رو بنویسید:
var textChanged = ControlTextChanged;
if (textChanged != null)
ControlTextChanged(textBox1, null);

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

همه کدها:
using System;
using System.Windows.Forms;

namespace VariousControls
{
public partial class UserControl1 : UserControl
{
public event EventHandler<EventArgs> ControlTextChanged;

public UserControl1()
{
InitializeComponent();
}

private void textBox1_TextChanged(object sender, EventArgs e)
{
var textChanged = ControlTextChanged;
if (textChanged != null)
ControlTextChanged(textBox1, null);
}
}
}

ممنون ولی بهتر نیس جا کد دادن راهنمایی کنین یاد بگیرن که delagate و رویداد چیه؟

winner1
شنبه 25 مهر 1394, 10:16 صبح
دوستم دنبال مفاهیم Delegateha باش مطلب پره بعدش هم رویداد نویسی event ها که خیلی راحت بعدش میتونی هر رویدادی که دلتت خواست ایجاد کنی

Mahmoud Zaad
شنبه 25 مهر 1394, 10:25 صبح
ممنون ولی بهتر نیس جا کد دادن راهنمایی کنین یاد بگیرن که delagate و رویداد چیه؟
منم خیلی با این روش موافق نیستم ولی اینجا بر خلاف فروم های خارجی اکثراً با راهنمایی موافق نیستند و بیشتر به دنبال کد هستن (البته قصد جسارت به شروع کننده تاپیک رو ندارم) من و خیلی از دوستان که در پست ها کاربر رو راهنمایی می کنیم، کاربر باز هم تاپیک رو ادامه میده تا کد رو دریافت کنه!
بعد دیدم این بحث یه مقدار ترسناک به نظر میرسه کد نوشتم!

kebriya
سه شنبه 12 آبان 1394, 12:23 عصر
سلام دوست عزیز.رویداد textchanged کامل عمل میکنه.من عین همین کارهارو برای رویداد keydown کردم اما ارور زیر رو میده:
Object reference not set to an instance of an object.
البته من جای خط کدی که سراسری تعربف کردید در کامپوننت یک کلمه key اضافه کردم:
public event EventHandler<KeyEventArgs> ControlKeyDown;
بقیه تو رویداد keydown تکست باکس کد زیر نوشتم:

var KeyDown = ControlKeyDown;
if (KeyDown != null)
ControlKeyDown(TextBox, null);

علتش چیه؟ایا نحوه نوشتن هر رویداد باهم فرق داره؟

Mahmoud.Afrad
سه شنبه 12 آبان 1394, 16:10 عصر
پارامتر مناسب باید در رویداد ControlKeyDown ارائه بشه که sender همان تکست باکس و KeyEventArgs هم همان e خواهد بود که از رویداد KeyDown تکست باکس بدست میاد. پس sender و e رو به ControlKeyDown بفرستید:

private void TextBox1_KeyDown(object sender, KeyEventArgs e)
{
if (ControlKeyDown != null)
{
ControlKeyDown(sender, e);
}
}

kebriya
سه شنبه 12 آبان 1394, 20:10 عصر
مرسی از تو دوست عزیز.واقعا مشکل بزرگی از منو حل کردید.جواب گرفتم.فقط ی سوال ایا تو شرط if باید اسمی که خودم برا رویداد انتخاب کردم باشه یا اسم رویداد اصلی تکست باکس؟
شما controlKeydwon نوشتید.من keydown هم نوشتم جواب گرفتم.ایا فرقی دارند باهم تو عملکرد؟

kebriya
سه شنبه 12 آبان 1394, 20:13 عصر
و ی سوال دیگه ایا نوشتن هر رویداد باهم متفاوت هست؟

Mahmoud.Afrad
سه شنبه 12 آبان 1394, 20:16 عصر
منظورت var KeyDown = ControlKeyDown; هست؟ خب KeyDown به ControlKeyDown اشاره میکنه(هر دو یکی هستن)؛ فرقی نمیکنه کدوم رو استفاده کنی. و البته من نفهمیدم این خط رو برای چی نوشتید چون کار خاصی انجام نمیده.
معمولا آرگومان دوم که اطلاعات مورد نیاز رو ارائه میده و در این مثال از نوع KeyEventArgs هست ممکنه متفاوت باشه(کلاس پایه EventArgs هست. میتونید یک کلاس اختصاصی از این کلاس ایجاد و پراپرتی های مورد نیاز رو بهش اضافه کنید تا در رویداد بهش دسترسی داشته باشید) . آرگومان اول هم کنترلی هست که رویداد رو raise کرده(بوجود آورده).