نمایش نتایج 1 تا 4 از 4

نام تاپیک: حذف یک خط از رشته

  1. #1
    کاربر تازه وارد آواتار shahryars
    تاریخ عضویت
    فروردین 1395
    محل زندگی
    Rio
    پست
    69

    Question حذف یک خط از رشته

    سلام
    من میخوام کاری کنم که یک خط مشخص از استرینگم پاک شه
    این کد رو نوشتم: (به عنوان مثال خط 2 در این کد)

    string str = "";
    for (int i = 1; i <= textBox2.Text.Split('\n').Length; i++)
    {
    if (i != 2)
    {
    str = str + GetLine(textBox2.Text, i) + Environment.NewLine;
    }
    }
    str = str.Remove(str.Length - 1);
    textBox2.Text = str;


    (getline محتوای خط n رو میده که به این صورت نوشتمش: )
    string GetLine(string text, int lineNo)
    {
    string[] lines = text.Replace("\r", "").Split('\n');
    return lines.Length >= lineNo ? lines[lineNo - 1] : null;
    }


    اما وقتی اجرا میکنم برنامه هنگ میکنه.
    جالبه که وقتی بجای

    textBox2.Text = str;

    مینویسم:

    textBox3.Text = str;

    این مشکل هنگ پیش نمیاد و برنامه به درستی کار میکنه
    یعنی فقط وقتی استینگ رو از تکست باکس 2 میگیرم، و در نهایت به داخل تکستباکس 2 میریزم هنگ میکنه
    اگه استرینگ رو از تکستباکس 2 بگیرم و خروجی رو به تکستباکس 3 بریزم برنامه به درستی اجرا میشه.
    لطفا کمکم کنید ایرادش رو پیدا کنم
    یا اگه روش بهتری برای حذف یک خط مشخص از استرینگ دارید بهم بگید.
    یعنی مثلا استرینگ ما اینه :

    1
    2
    3
    4
    5


    میخوام خط n ام، (مثلا دوم) پاک شه و به این صورت در بیاد:

    1
    3
    4
    5


    تشکر

  2. #2

    نقل قول: حذف یک خط از رشته

    با سلام
    کدت رو نگاه کردم و مشکلی نبود . علت هنگ رو هنوز نفهمیدم
    اما یه روش دیگه بهتون پیشنهاد میدم
            private void button1_Click(object sender, EventArgs e)
    {
    string line = "";
    string str = "";
    int Counter = 0;
    StringReader strReader = new StringReader(textBox2.Text);
    while ((line = strReader.ReadLine()) !=null)
    {
    Counter++;
    if (Counter == 2)
    {
    continue;
    }
    str = str + line + Environment.NewLine;
    }
    textBox2.Text = str;
    }


    میتونید هر شرطی رو توش بزارید . StringReader کلاس خیلی قوی هست . سرعت زیادی هم داره . اگر متن مورد نظر طولانی هست حتما از این کلاس استفاده کنید
    متد ReadLineAsync رو هم برای رشته های خیلی بزرگ بدون فریز شدن UI بدردتون میخوره

  3. #3
    کاربر تازه وارد آواتار shahryars
    تاریخ عضویت
    فروردین 1395
    محل زندگی
    Rio
    پست
    69

    نقل قول: حذف یک خط از رشته

    ممنون استاد عالی بود این
    فقط میخواستم بدونم کدی که من نوشتم روی کامپیوتر شما هم هنگ کرد؟

  4. #4

    نقل قول: حذف یک خط از رشته

    نقل قول نوشته شده توسط 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;
    }

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •