PDA

View Full Version : بدست آوردن نام متد رویداد کلیک یک کنترل



PetekDincos
یک شنبه 26 شهریور 1391, 21:29 عصر
با سلام
دوستان من برای بدست آوردن نام متد رویداد کلیک به صورت رشته در یه کنترل مثل MenuItem می اومدم و نام کنترل MenuItem رو بدست می آوردم بعد یه "Click_" بهش اضافه می کردم و متد مربوط به کلیک اون رو نیز به همین شکل یعنی ControlName+"_Click درست می کردم اما الان چون دارم با یه پروتکتور برنامه رو Obfucase می کنم این داستان به هم می خوره و نام متد تغییر می کنه می خواستم بدونم چطور می شه نام متد مربوط به رویداد کلیک یه کنترل رو بدست آورد ممنون می شم دوستانی که تو این زمینه اطلاعی دارند یه راه حلی یا راهنمایی برای حل این مشکل بفرمایند با تشکر .

PetekDincos
چهارشنبه 29 شهریور 1391, 10:33 صبح
با سلام
دوستان اگه کسی در این زمینه اطلاعی داره لطفا راهنمایی کنه خیلی گیر این مسئله هستم . با تشکر

barnamenevisforme
چهارشنبه 29 شهریور 1391, 15:05 عصر
اما الان چون دارم با یه پروتکتور برنامه رو Obfucase می کنم این داستان به هم می خوره و نام متد تغییر می کنه
سلام
مگه از obfoscator در حین نوشتن برنامه استفاده می کنید؟

danialafshari
چهارشنبه 29 شهریور 1391, 15:55 عصر
Obfucase رو بعد از پایان پروژت روی پروژه اعمال می کنی! من با چند تا پروتکتور کار کردم به همچین مشکلی بر نخوردم ! :متفکر:
پیشنهاد می کنم وقتی پروژت تمام شد با SmartAssembely اونو پروتکت کنی من که باش مشکلی پیدا نگردم

PetekDincos
چهارشنبه 29 شهریور 1391, 22:55 عصر
با سلام
دوستان عزیز سوال من در مورد پروتکت کردن با کدوم پروتکتور نیست من یه رشته از نام متد مربوط به کلیک رو بدست میارم و از اون رشته می یام در جای دیگه ای اون متد رو اجرا می کنم و چون از Obfucaser استفاده می کنم نام متد ها تغییر پیدا می کنه و این برام مشکل ایجاد می کنه و الان می خوام بدونم چطور می شه نام متد کلیک مربوط به یه کنترل رو در زمان اجرای برنامه بدست آورد . با تشکر

PetekDincos
پنج شنبه 30 شهریور 1391, 15:45 عصر
با سلام
مثلا برای یه کنترل Button که به این صورت رویداد کلیک داره


Button btn = new Button();
btn.Click += new EventHandler(btn_Click);

void btn_Click(object sender, EventArgs e)
{

}

که نام متد مربوط به رویداد کلیک این کنترل btn_Click هست من قبلا می اومدم برای اینکه نام متد رو بدست بیارم یه Name می دادم به کنترل مثلا btn01 بعد رویداد کلیک رو براش ایجاد می کردم که می شد btn01_Click که یه _Click به آخر نام کنترل اضافه می شه و با بدست آوردن نام کنترل می تونستم نام متد مربوط به رویداد کلیک رو نیز به این صورت ایجاد کنم و در یه کلاس دیگه این متد رو به این صورت با استفاده از نامش اجرا می کنم

Type type = typeof(Button);
MethodInfo method = type.GetMethod("btn_Click");
RoutedEventArgs mye = new RoutedEventArgs();
MyClass c = new MyClass();
object[] myobject = { sender, mye };
method.Invoke(c, myobject);

اما الان چون دارم از obfucase استفاده می کنم نام متد تغییر می کنه و به این صورت ControlName+"_Click" نام متد روبدست می آوردم چون با تغییر نام متد دیگه نمی تونم این کار رو انجام بدم اگه برای حل اینکه بتونم نام متد مربوط به رویداد کلیک یه کنترل رو مستقیما از خود کنترل بدست بیارم راه حلی دارید ممنون می شم راهنماییم کنید. با تشکر

Mahmoud.Afrad
جمعه 31 شهریور 1391, 11:48 صبح
اگر رویداد باتن را میخواهید فراخوانی کنید به راحتی این کار قابل انجام هست:
button1.PerformClick();
نیازی به دانستن نام رویداد نیست.

رویداد هر کنترل دیگری مدنظر شما باشه مثلا رویداد کلیک پیکچرباکس فرم1 به اینصورت(شما هنگام برنامه نویسی به متدها دسترسی دارید و نیاز به ساختن نامشان ندارید):
(Application.OpenForms["Form1"] as Form1).pictureBox1_Click(sender, e);


البته رویداد را از private به protected internal تغییر بدید.

PetekDincos
جمعه 31 شهریور 1391, 13:36 عصر
با سلام
ممنون از جوتبتون .
اونی که می خواستم نیست ، چون تعداد متدهای من زیاده و من کاری که انجام می دم اینه که در یه UserControl منوی برنامه رو قرار دادم و می یام از این UserControl یه لیست از پراپرتی های MenuItem های مربوط به منو رو بدست می یارم و در یه کنترل دیگه استفاده می کنم و چون تعداد منو آیتم ها زیاده به این صورت بخوام انجام بدم بایستی در یه ساختار switch برای هر منو آیتم این کار رو بکنم که زیاد جالب نمی شه اما مثل اینکه چاره ای نیست . با تشکر

Mahmoud.Afrad
جمعه 31 شهریور 1391, 16:41 عصر
باز هم فرقی نمیکنه. رویدادهای کلیک که در یوزرکنترل نوشتید را protected internal کنید و هرجا خواستید از طریق نام یوزرکنترل متد را فراخوانی کنید.

یک تکه کد از استفاده ای که میخواهید ببرید را بذارید مثلا جایی که میخواهید رویداد را فراخوانی کنید یا به پراپرتی ها دسترسی داشته باشید.

PetekDincos
جمعه 31 شهریور 1391, 19:10 عصر
با سلام
اون UserControl ای که می خوام از اون متدهای مربوط به کنترل منو رو فراخوانی کنم به این صورته که به تعداد MenuItem ها از این UserControl نمونه (Instanse) درست می کنم و در رویداد کلیک این UserControl با توجه به نمونه ای که مربوط به چه MenuItem ای هست که درست شده متد مربوط به کلیک اون منو آیتم رو فراخوانی می کنم و باید یه ساختار switch در رویداد کلیک UserControl بنویسم که با توجه به نام MenuItem ها ، متد مربوطه رو فراخوانی کنم اما تو روش خودم من نام متد رو به یه پراپرتی string تو UserControl زمانی که یه Instance از Usercontrol برای هر منو آیتم می خواستم درست کنم ارسال می کردم و در رویداد کلیک UserControl می اومدم مثل روش بالا ، متد رو با توجه به نامش درست می کردم و فراخوانی می کردم . با تشکر

Mahmoud.Afrad
شنبه 01 مهر 1391, 00:23 صبح
منو آیتم ها هم یک متد به نام performClick دارند دیگه:چشمک:

نیاز به سوئیچ کیس نیست.


یک مثال میزنم.
فرض کن یک یوزرکنترل با پراپرتی از نوع منوآیتم به صورت زیر داریم:
public partial class MyUserControl : UserControl
{
public MyUserControl()
{
InitializeComponent();
}

private ToolStripMenuItem menuItemThatCreateThisInstance;

public ToolStripMenuItem MenuItemThatCreateThisInstance
{
get { return menuItemThatCreateThisInstance; }
set { menuItemThatCreateThisInstance = value; }
}
}


حالا در فرم میخواهیم با کلیک منوآیتم یک نمونه از یوزرکنترل بسازیم و یک ارجاع از منوآیتم را در پراپرتی داخل یوزرکنترل نگه داریم. در ضمن با کلیک روی یوزرکنترل رویداد منوآیتم را از طریق پراپرتی اجرا کنیم:
private void myToolStripMenuItem_Click(object sender, EventArgs e)
{
MyUserControl uc = new MyUserControl();
uc.MenuItemThatCreateThisInstance = sender as ToolStripMenuItem;
uc.Click += new EventHandler(uc_Click);
this.Controls.Add(uc);
}
void uc_Click(object sender, EventArgs e)
{
(sender as MyUserControl).MenuItemThatCreateThisInstance.Perf ormClick();
}

بالاخره منوآیتم موردنظر را در پراپرتی قرار میدید و در رویداد بعد از cast کردن ، از طریق پراپرتی به رویداد performClick دسترسی دارید.

به همین راحتی :لبخند: