
نوشته شده توسط
shahryars
سلام
من میخوام کاری کنم که یک خط مشخص از استرینگم پاک شه
این کد رو نوشتم: (به عنوان مثال خط 2 در این کد)
اما وقتی اجرا میکنم برنامه هنگ میکنه.
جالبه که وقتی بجای
textBox2.Text = str;
مینویسم:
textBox3.Text = str;
این مشکل هنگ پیش نمیاد و برنامه به درستی کار میکنه
یعنی فقط وقتی استینگ رو از تکست باکس 2 میگیرم، و در نهایت به داخل تکستباکس 2 میریزم هنگ میکنه
اگه استرینگ رو از تکستباکس 2 بگیرم و خروجی رو به تکستباکس 3 بریزم برنامه به درستی اجرا میشه.
لطفا کمکم کنید ایرادش رو پیدا کنم
تشکر
وقتی دارید محتویات کنترل ها رو تغییر میدید مثلا textBox2.Text رو با مقدار جدیدی پر می کنید، رخدادی مثل TextChanged بروز پیدا می کنه.
اگر برای این رخداد متدی ننوشته باشید که طوری نیست، اما اگر به متدی مثل textBox2_TextChanged متصل اش کردید، باید حواستون باشه که اون متد نیاد، مجددا باعث تغییر مقدار textBox2 بشه.
چرا؟ چون اگر اینکار رو بکنه باز یک رخداد TextChanged دیگه اتفاق می افته و یک حلقه تکرار بی انتها بوجود میاد. بالاخره یکجا باید این حلقه تکرار رو متوقف کنید، یا دیگه مقدار textBox2.Text رو تغییر ندهید، یا اگر تغییر دادید در textBox2_TextChanged مجددا مقدارش رو تغییر ندید.
یکی از روش هایی که می توانید جلوی این حلقه رو بگیرید استفاده از یک متغیر جانبی است. یعنی در جایی که نمی خواهیم رخداد TextChanged برای تغییر مقدار کاری انجام بدهد،
مقدارش را true می کنیم تا رخداد کاری انجام ندهد و وقتی تغییر مورد نظر را اعمال کردیم مجددا false اش می کنیم.
private bool _freeze;
private void textBox1_TextChanged(object sender, EventArgs e)
{
if (_freeze)
{
return;
}
textBox1.Text = "new value";
}
private void button1_Click(object sender, EventArgs e)
{
_freeze = true;
textBox1.Text = "sample";
_freeze = false;
}