PDA

View Full Version : سوال: مشکل در اجرا فرمان foreah



Helmod
چهارشنبه 23 مرداد 1392, 22:26 عصر
سلام دوستان ، یه مشکلی برام پیش اومده

دستوری نوشتم برای اینکه هر گاه روی یک تکست باکس فکوس میشه رنگ پس زمینه اون بشه زرد ولی متاسفانه فقط تووی اولین تکست باکس اول این درست کار میکنه بقیه وقتی فوکوس میشن رنگشون تغییر نمیکنن

جالب اینه که کدی هم نوشتم برای اینکه وقتی روی دکمه " خالی کردن فیلد ها " کلیک بشه همه فیلد ها خالی بشن درصورتیکه بازم فقط تکست باکس اول خالی میشه

لطفاً کد زیر رو چک کنید شاید جایی ایراد داره مرسی :


کد برای تغییر رنگ :

public frmCreateNewEm()
{
InitializeComponent();


foreach (Control CTRL in this.Controls)
{
if (CTRL is TextBox)
{


CTRL.GotFocus += new EventHandler(CTRL_GotFocus);
CTRL.LostFocus += new EventHandler(CTRL_LostFocus);

}
}

private void frmCreateNewEm_Load(object sender, EventArgs e)
{


txtNationalCode.Focus();
txtEmCode.Text = ( Program.CurrentPersianYear.Substring(2,2)+ RanCode(8));
lblNationalCode.Visible = false;

System.Globalization.CultureInfo language = new System.Globalization.CultureInfo("fa-ir");

InputLanguage.CurrentInputLanguage = InputLanguage.FromCulture(language);


}


void CTRL_LostFocus(object sender, EventArgs e)
{

TextBox TXT = sender as TextBox;
TXT.BackColor = Color.White;
}

void CTRL_GotFocus(object sender, EventArgs e)
{
TextBox TXT = sender as TextBox;
TXT.BackColor = Color.Yellow;
}

private void button2_Click(object sender, EventArgs e)
{
foreach (Control CTRL in this.Controls)
{
if (CTRL is TextBox)
{
(CTRL as TextBox).Clear();

}
}

}

mehrdad1991h
پنج شنبه 24 مرداد 1392, 00:17 صبح
دوست عزیز EventHandler شما برای تمام تکست باکس هایی که داری ست نمیشه..... به همین خاطره که فقط اولی رنگش تغییر میکنه
برای اطمینان به صورت دستی در پراپرتی تک تک تکست باکس هایی که داری این را ست کنن تا ببینی کار میدهد یا خیر

یکی از دلایلی هم که ممکنه بهت کار ندهد میتونه این باشه که در فرمت مثلا از پنل یا گروپ باکس استفاده کردی و تکست باکس ها داخل پنل یا گروپ یاکست قرار گرفته اند
اینی که شما نوشتی تنها در صورتی میتونه ست کنه که تکست باکس ها روی خود فرم اصلی باشن
نه در تب کنترل یا پنل یا گروپ باک یا موارد مشابه

امیدوارم کمکت کنه
موفق باشی

مهرداد صفا
پنج شنبه 24 مرداد 1392, 01:38 صبح
با سلام.
برای رفع مشکلی که آقای mehrdad1991h اشاره کردند، در صورتی که نامگذاری کنترلها به ترتیب (Textbox1,textbox2, textboxN...) باشد می توانید از متود Controls.Find استفاده کندی. اولین آرگومنت این متود نام کنترل مورد نظر و دومین آرگومنت مشخص می کند که آیا باید فرزندان (از قبیل panel ها و ...) هم جستجو شوند یا نه.
مثال:

for(int i =0;i<n;i++)
{
this.Controls.Find("textBox"+i.ToString(),true).First().GotFocus+=s,args=> sender.BackColor=Color.Black);}

FastCode
پنج شنبه 24 مرداد 1392, 02:29 صبح
لازم نیست اینقدر شک کنید.مشکل کاملا مشخص هست و البته نیاز به راه حل دستی و O(N^2) هم نداره.

void AddColorHandlers()
{
foreach (Control CTRL in this.Controls)
{
if (CTRL is TextBox)
{
CTRL.GotFocus += new EventHandler(CTRL_GotFocus);
CTRL.LostFocus += new EventHandler(CTRL_LostFocus);
}
else
{
AddColorHandlers(CTRL);
}
}
}

مهرداد صفا
پنج شنبه 24 مرداد 1392, 04:09 صبح
لازم نیست اینقدر شک کنید.مشکل کاملا مشخص هست و البته نیاز به راه حل دستی و O(N^2) هم نداره.

void AddColorHandlers()
{
foreach (Control CTRL in this.Controls)
{
if (CTRL is TextBox)
{
CTRL.GotFocus += new EventHandler(CTRL_GotFocus);
CTRL.LostFocus += new EventHandler(CTRL_LostFocus);
}
else
{
AddColorHandlers(CTRL);
}
}
}
استفاده از این روش بدون در نظر گرفتن نام کنترلها و در هر صورت عملی است. فقط یکی دو مورد که فراموش شده بود رو اصلاح می کنم تا دوستان مبتدی (مثل خودم) مشکل نداشته باشند:


void AddColorHandlers(Control ParentControl)
{
foreach (Control CTRL in ParentControl.Controls)
{
if (CTRL is TextBox)
{
CTRL.GotFocus += new EventHandler(CTRL_GotFocus);
CTRL.LostFocus += new EventHandler(CTRL_LostFocus);
}
else
{
AddColorHandlers(CTRL);
}
}
}

Helmod
پنج شنبه 24 مرداد 1392, 19:03 عصر
بله درسته ، تکست باکس ها در گروپ باکس بود بعد از حذف گروپ باکس و قرار دادن تکست باکس ها روی فرم اصلی مشکل حل شد

mehdi.mousavi
پنج شنبه 24 مرداد 1392, 20:00 عصر
سلام.

Event های GotFocus و LostFocus فقط برای Update کردن UICue ها باید استفاده بشه و نه تغییر Background Color کنترل ها! یکی دیگه از موارد استفاده این دو Event، هنگامی هستش که دارید Custom Control طراحی می کنید! در مابقی مواقع نباید از این دو Event استفاده کنید. در عوض، باید از دو رخداد Leave و Enter استفاده کنید. این مساله به کنار، این چه وضع نامگذاری متغیرها و توابع هستش؟ گفتگوی فنی شماره یک رو همتون فراموش کردید؟ کد بدبو و ...؟

در هر حال... روش صحیح انجام این کار، Subclass کردن کلاس TextBox هستش:


public class TextBoxEx : TextBox
{
protected override void OnLeave(EventArgs e)
{
base.OnLeave(e);
BackColor = Color.White;
}

protected override void OnEnter(EventArgs e)
{
base.OnEnter(e);
BackColor = Color.Yellow;
}
}


اینجا، من کلاس جدیدی میسازم که در اون، دو متود Leave و Enter رو override می کنم. حالا روی فرمم، هر جا که مایل باشم، می تونم جای TextBox از TextBoxEx استفاده کنم تا به هدف برسم. دیگه نه نیازی هستش Loop بنویسید، نه اینکه هر جا در هر فرم اون Loop رو تکرار کنید و ...

موفق باشید.

FastCode
پنج شنبه 24 مرداد 1392, 20:50 عصر
سلام.

Event های GotFocus و LostFocus فقط برای Update کردن UICue ها باید استفاده بشه و نه تغییر Background Color کنترل ها! یکی دیگه از موارد استفاده این دو Event، هنگامی هستش که دارید Custom Control طراحی می کنید! در مابقی مواقع نباید از این دو Event استفاده کنید. در عوض، باید از دو رخداد Leave و Enter استفاده کنید. این مساله به کنار، این چه وضع نامگذاری متغیرها و توابع هستش؟ گفتگوی فنی شماره یک رو همتون فراموش کردید؟ کد بدبو و ...؟

در هر حال... روش صحیح انجام این کار، Subclass کردن کلاس TextBox هستش:


public class TextBoxEx : TextBox
{
protected override void OnLeave(EventArgs e)
{
base.OnLeave(e);
BackColor = Color.White;
}

protected override void OnEnter(EventArgs e)
{
base.OnEnter(e);
BackColor = Color.Yellow;
}
}


اینجا، من کلاس جدیدی میسازم که در اون، دو متود Leave و Enter رو override می کنم. حالا روی فرمم، هر جا که مایل باشم، می تونم جای TextBox از TextBoxEx استفاده کنم تا به هدف برسم. دیگه نه نیازی هستش Loop بنویسید، نه اینکه هر جا در هر فرم اون Loop رو تکرار کنید و ...

موفق باشید.
Nostalgia
یاد زمانی افتادم که شما مدیر نبودید.
یکی از پستهای شما دقیقا با همین جملات و موضوع بود که باعث شد برم سراغ مطالعه و یاد گرفتن.
از وقتی که دیگه پست نمیدین کیفیت فوروم افت کرده.