PDA

View Full Version : سوال: چگونگی حرکت بین کنترل های فرم



pooya_1868
چهارشنبه 04 آبان 1390, 11:30 صبح
سلام به همگی
من احتیاج به یک حلقه دارم که بتونم بین تمام کنترل های موجود بر روی فرم حرکت کنم... مثلا اگر 2تا کنترل textbox روی فرم بود بتونم اونا رو بخونم و به خاصیت هاشون دسترسی داشته باشم...

ممنون میشم اگر راهنمایی کنید...

sobaisobai
چهارشنبه 04 آبان 1390, 11:50 صبح
سلام دوست عزیز
با Foreach میتونی
foreach (Control c in this.Controls)
{
if (c is TextBox)
{
TextBox f = (TextBox)c;
MessageBox.Show(f.Text);

}
}
موفق باشی

ali_habibi1384
چهارشنبه 04 آبان 1390, 12:37 عصر
جسارت نباشه ولي كدتون باگ داره بعنوان مثال وقتي ابزاري داخل group قرار بگيره با اين كد بهش دسترسي نداريم. من اين كد رو پيشنهاد ميدم:



public static void LoadSkin(Control root )
{
foreach (Control ctl in root.Controls)
{
LoadSkin(ctl);

if (ctl is TextBox )
{
TextBox tmp;
tmp = (TextBox)ctl;
tmp.Font = new System.Drawing.Font("B Roya", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(178)));
tmp.RightToLeft = System.Windows.Forms.RightToLeft.No;
tmp.TextAlign = System.Windows.Forms.HorizontalAlignment.Center;
}
}
}


با اين كلاس و تابع اگر كنترلي خودش باز حاوي كنترل ديگري بود واردش ميشه و اشيا روي اونو ميخونه.

sobaisobai
چهارشنبه 04 آبان 1390, 12:46 عصر
سلام ali_habibi1384 (http://barnamenevis.org/member.php?48789-ali_habibi1384)
خواهش میکنم ممنون از نظرت
ولی اگه کنترل ها داخل مثلا GroupBox یا هر چیز دیگه ای هم باشه هم میتونی از دستور زیر استفاده کنی
foreach (Control c in this.groupBox1.Controls)
{
if (c is TextBox)
{
TextBox f = (TextBox)c;
MessageBox.Show(f.Text);
}
}

ali_habibi1384
چهارشنبه 04 آبان 1390, 12:59 عصر
چيزي كه ميگي درست اما اين مستلزم اينه كه شما اسم گروپ باكس ها رو بدوني و يكي اينجوري كلي كد بايد براش بزني شما در نظر بگير كه يه برنامه نوشتي با 100 تا فرم توي هر فرمش هم ممكنه چندتا گروپ باكس باشه واسه هر كدوم بخواي تغيير بدي كه نميشه. ولي با كلاسي كه من نوشتم شما فقط كافيه يكبار بنويسي سپس يك فرم رو بهش پاس بدي تا كليه كنترلهاي موجود روي اونو تغيير بدي.سعي كن كدي كه مينويسي كم حجم بهينه و كلي باشه و مطابق ما روشهاي برنامه نويسي نه اينكه فقط يكجوري كد بنويسي كه جواب بده.
موفق باشي

sobaisobai
چهارشنبه 04 آبان 1390, 13:08 عصر
درسته
اما واسه وقتیه که تعداد فرمها یا پنل ها یا .... زیاد باشه

wolf_majid
چهارشنبه 04 آبان 1390, 14:49 عصر
public static void LoadSkin(Control root )
{
foreach (Control ctl in root.Controls)
{
LoadSkin(ctl);

if (ctl is TextBox )
{
}
}
}



کدتون رو تست نکردم ولی به نظرم باگ داره
شما بعد از foreach دوباره تابع را صدا می زنید که این کار برای هر شی ای که حالت Collection (مثل panel) داشته باشه درست عمل می کنه
اما فرض کنید شی تکست باکس باشه من هر چی فکر می کنم انگار سراغ if نمی ره

ali_habibi1384
چهارشنبه 04 آبان 1390, 17:36 عصر
پيشنهاد ميكنم اول تست كنيد پس!

wolf_majid
چهارشنبه 04 آبان 1390, 18:04 عصر
تست کردم حق با شماست
اگر درست متوجه شده باشم زمانی که شی collection نباشه سراغ If می ره
درسته ؟

ali_habibi1384
چهارشنبه 04 آبان 1390, 18:43 عصر
درسته.اگر داخل شي شي ديگه اي وجد نداشته باشه بقيه الگوريتم اجرا ميشه اين برنامه از توابع تو در تو استفاده شده.