( تعداد نمایش : 856 )

صدا زدن رویدادهای User Control از داخل فرم‌های وب

استفاده از کنترل‌های کاربری یا User Control در میان برنامه نویسان ASP.NET طرفداران زیادی دارد. با استفاده از UC می توان مجموعه ای از کنترلهای سمت سرور یا html را در جاهای مختلف از صفحات aspx یا داخل UCهای دیگر استفاده کرده و از نوشتن کدهای تکراری اجتناب نمود. در بسیاری از موارد لازم می‌شود که بتوانیم رویدادی که درون یک UC اتفاق می‌افتد را در وب فرم مادر اصطلاحاً Handle کنیم. این مقاله به نحوه چگونگی انجام این کار می‌پردازد.

——————————————————————————–
استفاده از کنترل‌های کابری UCها (User Control) در میان برنامه نویسانASP.NET طرفداران زیادی دارد. با استفاده از UC می توان مجموعه ای از کنترلهای سمت سرور یا html را در جاهای مختلف از صفحات aspx یا داخل UCهای دیگر استفاده کرده و از نوشتن کدهای تکراری اجتناب نمود. همچنین می توان تنها قسمتی از یک Web Form را با کمک UCها Cache نمود (Fragment Caching). یکی دیگر از استفاده‌های UCها بکارگیری آنها بعنوان یک کنترل سمت سرور می باشد. که در این صورت می توان برای UC مورد نظر Methodها و Propertyهای مختلفی را بسته به نیاز تعریف کرده و از آنها استفاده نمود. آن دسته از توابعی که اکثر کنترلهای سمت سرور از آن برخوردار می باشند، توابع رویداد یا همان Eventها می باشند. مثل تابع رویداد فشردن یک کنترل از نوع Button.

اکنون می خواهیم بدانیم که در UCها چگونه می توان توابع رویداد تعریف کرده و از آنها استفاده نمود. به دو طریق می توان برای یک UC تابع رویداد تعریف کرد. روش اول تعریف یک تابع رویداد داخلی برای یک UC می باشد. که در این صورت تابع رویداد تنها در داخل UC صدا زده می‌شود. اما روش دوم تعریف توابع رویداد خارجی است به طوریکه بتوان این توابع را از خارج UC نیز صدا زد. بحث اصلی این مقاله پیرامون همین نوع از توابع رویداد یا Event می باشد.

برای درک بهتر مطلب بهتر است که به طرح یک مثال بپردازیم. فرض کنید که می خواهید یک کنترل که عملکرد یک منو را داشته باشد با استفاده از UC ایجاد کنید. این منو دارای آیتم‌های مختلفی است که هر آیتم نیز ایندکس خاص خود را دارد. حال می خواهیم یک Event برای این منو تعریف کنیم بطوریکه بتوانیم آن را از همان جایی که UC را استفاده می کنیم، صدا بزنیم. برای ایجاد این کنترل قبل از هر چیز بهتر است که از یک سرور کنترل تکرار شونده و داده پذیر (Data Bound) مثل Repeater ، DataList و یا DataGrid استفاده کنیم. در این مقاله ما از کنترل DataList استفاده می کنیم.

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

بسیار خوب، در ابتدا در کلاس مربوط به UC منو، یک کلاس مثلاً بنام SelectionChangedEventArgs تعریف می کنیم. این کلاس می بایست حتماً از کلاس System.EventArgs ارث بری داشته باشد. فعلاً برای این کلاس یک متغیر که نشان دهنده ایندکس انتخاب شده از منو می باشد را تعریف می کنیم. بعداً شما می‌توانید متغیرها و متدهای مورد نظر خود را به این کلاس اضافه کنید. پس تا اینجای کار کلاسی همانند زیر در داخل کلاس مربوط به UC منو داریم.

public class SelectionChangedEventArgs : EventArgs
{
public int SelectedIndex;
}

برای تعریف تابع رویداد، نیار به یک تابع delegate داریم. این تابع delegate را می توان با استفاده از کلاسی که در بالا تعریف کردیم بسازیم. کد مربوط به تعریف تابع delegate و تابع رویداد به شکل زیر می باشد.

public delegate void SelectionChangedEventHandler(object sender, SelectionChangedEventArgs e);
public event SelectionChangedEventHandler SelectionChanged;

برای تحقق یافتن این خواسته‌مان نیاز به یک تابع رویداد داخلی نیز داریم. از آنجا که هدف ما مشخص کردن انتخاب آیتم های کنترل منو می باشد، پس می بایست که تابع رویداد مربوط به تغییر ایندکس انتخاب شده را برای کنترل DataList موجود در UC را اضافه کنیم. پس از انجام این کار نوبت به تعریف تابع اصلی مان می‌رسد. یعنی تابعی که در آن مقدمات مربوط به صدا زدن Event خارجی صورت گیرد. این تابع را بصورت زیر تعریف می کنیم.

public void SelectMenuItem(int index)
{
dlMenu.DataBind();
SelectionChangedEventArgs ev = new SelectionChangedEventArgs();
ev.SelectedIndex = index;
if(SelectionChanged != null)
SelectionChanged(this, ev);
}

همانطور که می‌بینید در این تابع ابتدا کنترل DataList تغذیه می‌شود. سپس یک نمونه از کلاسی که چندی قبل تعریف کردیم ایجاد می‌شود و تنها عضو این کلاس که مشخص کننده ایندکس انتخاب شده می باشد توسط تنها پارامتر این تابع مقداردهی می‌شود. پس از آن در صورت null نبودن تابع رویداد SelectionChanged که مربوط به تابع SelectionChangedEventHandler که خود یک delegate می‌باشد صدا زده می‌شود. این کار باعث می‌شود تا تابع رویدادی که برای این کنترل منو در هرکجا تعریف کرده‌ایم، صدا زده شود.

دیدگاه خود را بیان کنید.

باید وارد سایت شده باشید برای دیدگاه دادن