PDA

View Full Version : فراخوانی دو تابع متفاوت در دو UserControl تو در تو



piroozman
سه شنبه 12 شهریور 1398, 15:34 عصر
در برنامه ای از یک UserControl در UserControl دیگری استفاده کرده ام. و هر دوی آنها را در یک فرم قرار داده ام. UserControl1 دارای دکمه هایی است که یکی از آنها برای عملیات Save مورد استفاده قرار میگیرد. چگونه می توانم عملیات Save را هم در فرمی که هر دو UserControl قرار دارند و هم در UserControl2 مورد استفاده قرار بدم. به طور دقیقتر این که از Delegate ها برای فراخوانی متدهای مورد نظر استفاده کرده ام. حال قصد دارم پیش از ذخیره سازی داده ها، ابتدا محتوای فیلدهای موجود در UserControl2 مورد بررسی قرار گیرد و پس از ان داده های در تابعی به نام Save در فرم اصلی ذخیره شوند. اگر به شکل توجه کنید، می خوام بعداز کلیک روی Save Button، ابتدا تابع Function1_UserConrol2 و سپس Function2_MainForm فراخوانی بشه.
150707
با تشکر

ROSTAM2
چهارشنبه 13 شهریور 1398, 09:33 صبح
سلام Event بساز برای uc2 که تابع save از uc1 رو اجرا کنه تمومش کن بره پی کارش! :متفکر:

piroozman
شنبه 16 شهریور 1398, 11:44 صبح
سلام. این کار رو کردم. بی انصاف اول میره تابع موجود در Main Form را فراخوانی میکنه بعد میره سراغ رویداد موجود در Usercontrol2. در حالی که میخوام اول تابع موجود در UC2 فراخوانی بشه.

piroozman
یک شنبه 17 شهریور 1398, 08:38 صبح
یعنی کسی بلد نیست؟ یا نمیشه این کار رو کرد؟ ای خدا ...

Mahmoud.Afrad
یک شنبه 17 شهریور 1398, 09:57 صبح
یک کد مثال از چیزی که ساختید بزارید و بگید چه انتظاری دارید.

piroozman
یک شنبه 17 شهریور 1398, 10:59 صبح
یک کد مثال از چیزی که ساختید بزارید و بگید چه انتظاری دارید.
هر چند فکر میکنم پست اول کاملا واضح هستش ولی سعی می کنم مشکلم رو به صورت کامل شرح بدم. از UC1 یا همان User Control 1، فقط به عنوان ابزاری برای ویرایش، حذف یا ذخیره داده ها استفاده می کنم که اسم اون رو ToolBox گذاشتم که یکی از دکمه های آن، دکمه تایید برای ذخیره سازی داده ها هستش که در شکل Save Button نامگذاری شده است. از این ابزار در ابزاری دیگه ای مانند uc2 یا حتی در فرم های اصلی برنامه به صورت مستقل استفاده می کنم. در uc2 فیلدهایی برای ورود داده ها توسط کاربران تعبیه شده که می توان از اون در قسمت های مختلف برنامه استفاده کرد. حال uc1 رو داخل uc2 قرار دادم که عملکرد uc2 رو با اون کنترل کنه (ویرایش، حذف و به روز رسانی). حال uc2 عملا از یه سری کنترل مانند تکس باکس و دکمه تشکیل شده (برای ورود داده ها) و یک جعبه ابزار که خودش یک uc هستش که اسمش رو گذاشتیم uc1. از uc2 در قسمت های مختلف برنامه استفاده می کنم. حالا میخوام وقتی کاربر روی دکمه Save کلیک میکنه اول اعتبار سنجی داده های ورودی انجام بشه. میخوام این اعتبار سنجی در uc2 انجام بشه و مجبور نباشم هر جا که از این uc2 استفاده می کنم بخوام کدها رو تکرار کنم. و بعد از اعتبار سنجی، عملیات اصلی Save فراخوانی بشه. برای Save داده ها از Delegate به شرح کد های زیر استفاده کرده ام.
در User Control 1 یا همون Toolbox:

public Delegate SaveDelegate;
private void SaveButton_Click(object sender, DevExpress.XtraBars.ItemClickEventArgs e)
{
SaveDelegate.DynamicInvoke();
}

توجه داشته باشید، چون در بعضی از فرم های برنامه از uc1 به صورت مستقل استفاده کرده ام، استفاده از کد فوق در این user control الزامی است.
به منظور اعتبار سنجی در User Control 2 نمیدونم چی بنویسم!!!

//I need some code to validate fields in user control 2

در Main Form که از UC2 استفاده کرده ام. برای فراخوانی رویداد SaveButton_Click به صورت زیر کد نوشته ام:

public delegate void SaveDelegate();
private event SaveDelegate saveEvent;
public MainForm()
{
InitializeComponent();
saveEvent += new SaveDelegate(Save);
UserControl2.toolboxUserControl1.SaveDelegate = saveEvent;
}
private void Save()
{
//Do something
}

Mahmoud.Afrad
یک شنبه 17 شهریور 1398, 11:41 صبح
اگر toolboxUserControl1 را private کنید اونوقت متوجه میشید که باید چه کنید.
یک Delegate در uc2 نیاز دارید. توی این دلیگت اول اعتبارسنجی کنید و بعد دلیگت uc1 را فراخوانی کنید. در فرم هم از دلیگت/رویداد uc2 استفاده کنید.

ebrahim.rayatparvar
دوشنبه 18 شهریور 1398, 10:01 صبح
شما کیگید دکمه save تو user control1 هست. پس برای اینکه از user control2 بهش دسترسی داشته باشی پس برای user control 1 یک event برای کلیک دکمه بساز و تو user control2 اونو فراخوانی کن.