PDA

View Full Version : شناسایی کنترل



esmartiz_red
پنج شنبه 07 آبان 1388, 22:13 عصر
دوستان یه کد می خوام که نام کنترل رو بگیره و تشخیص بده نوع کنترل چیه
ممنون

sunn789
پنج شنبه 07 آبان 1388, 22:45 عصر
بسته به ینکه کی و چه زمان به نوع کنترل نیاز داری ـ توبیشتر event ها یه متغیر وجود داره به اسم Sender که نوع متغیر همراه با کلی اطلاعات دیگه رو میگه

اَرژنگ
جمعه 08 آبان 1388, 06:49 صبح
دوستان یه کد می خوام که نام کنترل رو بگیره و تشخیص بده نوع کنترل چیه
ممنون
این کد در چه ابجکتی باید تعریف شده باشد؟ بر رویه همان فرمی که کنترل بر روش است؟

esmartiz_red
جمعه 08 آبان 1388, 12:34 عصر
هم توی خود اون فرم که کنترل داخلش قرار داره و هم نام کنترل رو به یه متد از یک کلاس پاس بدیم و اون تشخیص بده
ممنون

sd.CSharpProgrammer
جمعه 08 آبان 1388, 23:04 عصر
میتونی با استفاده از عملگر is و یا متدهای GetType و Typeof اینکار رو انجام بدی. البته پیشنهاد میکنم بجای اینکه نام کنترل رو به متد بدی خودش رو بدی که راحتتر تشخیص داد. مثال :



enum ControlType { IsButton, IsLabel, IsTextBox } // har controle digei ke mikhay ezafe kon

ControlType GetControlType(Control myControl)
{
if (Control.GetType() == typof(System.Windows.Forms.Button)
return ControlType.IsButton;
else if (Control.GetType() == typof(System.Windows.Forms.Label)
return ControlType.IsLabel;
else if (Control.GetType() == typof(System.Windows.Forms.TextBox)
return ControlType.IsTextBox;
}

فرض کن یه تکست باکس به اسم firstName داری که میخوای با استفاده از یه حلقه بفهمی این کنترل از چه نوعیه.
میتونی تویه برنامه از متد بالا به اینصورت استفاده کنی :



switch (GetControlType(firstName))
{
case ControlType.IsButton:
MessageBox.Show("My control is button...");
break;
case ControlType.IsLabel:
MessageBox.Show("My control is label...");
break;
case ControlType.TextBox:
MessageBox.Show("My control is textbox...");
break
}

البته اگه خیلی اصرار داری که براساس نام کنترل بفمهی از چه نوعیه میتونی کنترلهاتو با روش مجارستانی نامگذاری کنی و با استفاده از پیشونده کنترلها تو یه حلقه foreach بفهمی از چه نوعیه.

موفق باشی

اَرژنگ
شنبه 09 آبان 1388, 02:13 صبح
هم توی خود اون فرم که کنترل داخلش قرار داره و هم نام کنترل رو به یه متد از یک کلاس پاس بدیم و اون تشخیص بده
ممنون
قسمتی که سبز شده ممکن است
قسمتی که قرمز شده ممکن نیست (با رفلکشن میشه یک چیزی سمبل کرد ولی کار معمولی نیست)

دلیل اینکه به چنین چیزی احتیاج دارید چیه؟ مشکل اصلی که به این شکل میخواهید حل کنید چی هست؟ استفاده از این نوع روش معمولاً اشتباه بودن یک چیزی در روشی که استفاده میشه است.

اَرژنگ
شنبه 09 آبان 1388, 02:15 صبح
بجای اینکه نام کنترل رو به متد بدی خودش رو بدی که راحتتر تشخیص داد.
با دادن نام کنترل خالی اصلا ممکن نیست که بشه تشخیص داد.

Reza_Yarahmadi
شنبه 09 آبان 1388, 09:17 صبح
با دادن نام کنترل خالی اصلا ممکن نیست که بشه تشخیص داد.
دوست عزیز کد زیر رو امتحان کن ببین میشه یا نه!

MessageBox.Show(this.Controls.Find("textBox1", true)[0].GetType().ToString());
برای اینکه در مواقعی که کنترلی با نام مورد نظر وجود نداره خطایی پیش نیاد بهتره این کد رو توی try - catch بنویسید.

اَرژنگ
شنبه 09 آبان 1388, 10:44 صبح
دوست عزیز کد زیر رو امتحان کن ببین میشه یا نه!

MessageBox.Show(this.Controls.Find("textBox1", true)[0].GetType().ToString());برای اینکه در مواقعی که کنترلی با نام مورد نظر وجود نداره خطایی پیش نیاد بهتره این کد رو توی try - catch بنویسید.دوست عزیز توجه به این قسمت:
"هم نام کنترل رو به یه متد از یک کلاس پاس بدیم"
کدی که فرستاده شد، همانطوری که گفته شد فقط داخل فرم کار میکنه،
و استفاده از این نوع روشها معمولاً نشانگر اشتباه در طراحی است.
روش بهتر این است که این گونه روشها استفاده نشه و از طراحی درست پیروی بشه.
بستگی به اینکه چرا احتیاج به چنین چیزی است روشهایه درست میشه پیشنهاد داد.

Reza_Yarahmadi
شنبه 09 آبان 1388, 16:01 عصر
دوست عزیز توجه به این قسمت:
"هم نام کنترل رو به یه متد از یک کلاس پاس بدیم"
کدی که فرستاده شد، همانطوری که گفته شد فقط داخل فرم کار میکنه،
با فرستادن نام فرم و نام کنترل مورد نظر به راحتی میشه این کارو انجام داد. به هر حال باید تعیین کرد توی کدوم فرم دنبال کنترل مورد نظر هستیم.

اَرژنگ
یک شنبه 10 آبان 1388, 12:17 عصر
با فرستادن نام فرم و نام کنترل مورد نظر به راحتی میشه این کارو انجام داد. به هر حال باید تعیین کرد توی کدوم فرم دنبال کنترل مورد نظر هستیم.
نام کنترل و نام فرم برایه این کار کافی نیست،
تازه اگر هم میشد بازهم روش درستی نیست.
کار کردن با رشته‌ها به جایه تایپها بیشتر مشکلات به بار میاره تا راه حل.

Reza_Yarahmadi
یک شنبه 10 آبان 1388, 19:01 عصر
نام کنترل و نام فرم برایه این کار کافی نیست،
یک نمونه برای نقض این جمله:
string GetControlType(string FormName, string ControlName)
{
return Application.OpenForms[FormName].Controls.Find(ControlName, true)[0].GetType().ToString();
}

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

اَرژنگ
دوشنبه 11 آبان 1388, 00:09 صبح
یک نمونه برای نقض این جمله:
string GetControlType(string FormName, string ControlName)
{
return Application.OpenForms[FormName].Controls.Find(ControlName, true)[0].GetType().ToString();
}

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

return Application.OpenForms[FormName].Controls.Find(ControlName, true)[0].GetType().ToString


در جمله گفته شده بود که نام فرم و نام کنترل برایه اینکار کافی نیستند.
قسمتی که قرمز و بُلد شده هنوز احتیاج با داشتن اطلاعات بیشتر از نام فرم و نام کنترل را نشان میده.در ضمن احتیاج به باز بودن فرم است، اگر فرم بسته بود چی؟
برایه پیشرفت برایه نشان دادن نقض جمله در این روش راه حل باید ۳ نقطه در نظر گرفته بشه:
۱.متد مطعلق به یک کلاس (به جز فرم) دیگر است و
۲.کلاس ممکن است که در یک نیم اسپیس و یا اسمبلی دیگر قرار گرفته باشد و به شکل ضمنی قابلت دسترسی به اپلیکیشن ابجکت را نداشته باشد.
۳.آرگومنهایه متد فقط نام کنترل و نام فرم باشند.
روشی که برایه نقض بود جمله استفاده شده از استفاده دسترسی به فرم که اپلیکیشن ابجکت به شکل گلوبال قابل اختیار قرار میده استفاده میکنه.
این جمله :"نام کنترل و نام فرم برایه این کار کافی نیست،" هنوز به حالت نقض نشده پابرجاست.
اگر فرض کنیم که این جمله "یه تایپ که در دو طرف همیشه مقدار ثابتی رو داره " درست باشد چه احتیاجی به فرستادن مقدار است؟
در ضمن روش درست فرستادن استفاده از نام کنترها نیست، با استفاده از وب سرویس روش استاندارد حل کردن چنین سوالتیست.

موفق باشید