PDA

View Full Version : سوال: مشکل در ذخیره کردن ListBox در فایل



daniyaltjm
یک شنبه 24 مرداد 1395, 22:03 عصر
سلام ، مشکل این کد چیه چرا فقط آخرین آیتم لیست باکس رو ذخیره میکنه؟!

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace @for
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 1000; i++)
{
listBox1.Items.Add(i);
}
listBox1.SelectedItem = listBox1.Items.Count - 1;
}

private void button2_Click(object sender, EventArgs e)
{
SaveFileDialog sf = new SaveFileDialog();
sf.ShowDialog();
string p = sf.FileName;
for (int i = 0; i < listBox1.Items.Count; i++)
{
listBox1.SelectedIndex = i;
StreamWriter sw = new StreamWriter(p);
sw.Write(listBox1.SelectedItem.ToString());
sw.Close();
}




}
}
}

omid nasri
یک شنبه 24 مرداد 1395, 22:10 عصر
در واقع به تعداد چرخه حلقه داری در این فایل Replace میکنی، کدهای موجود در for رو برسی کنید مجدد.

daniyaltjm
یک شنبه 24 مرداد 1395, 22:18 عصر
در واقع به تعداد چرخه حلقه داری در این فایل Replace میکنی، کدهای موجود در for رو برسی کنید مجدد.

آره خوب اینو که میدونم حالا چطوری باید هر آیتم لیست باکس به فایل اضافه بشه؟ از WriteLine هم استفاده کردم نشد.

daniyaltjm
یک شنبه 24 مرداد 1395, 22:33 عصر
مشکل حل شد.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace @for
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i < 1000; i++)
{
listBox1.Items.Add(i);
}
listBox1.SelectedItem = listBox1.Items.Count - 1;
}

private void button2_Click(object sender, EventArgs e)
{
SaveFileDialog sf = new SaveFileDialog();
sf.ShowDialog();
string p = sf.FileName;
for (int i = 0; i < listBox1.Items.Count; i++)
{
listBox1.SelectedIndex = i;
FileStream fs = new FileStream (sf.FileName ,FileMode.Append ,FileAccess.Write );
StreamWriter sw = new StreamWriter(fs);
sw.WriteLine(listBox1.SelectedItem.ToString());
sw.Close();
}




}
}
}

omid nasri
یک شنبه 24 مرداد 1395, 23:43 عصر
باید توجه کنید که فقط کار کردن کد مهم نیست آیا صحیح پیاده سازی صورت گرفته که بعدا دچار مشکل نشوید! در حال حاظر به تعداد گردش حلقه شما دارید شی میسازید در حالی که میشه با یک شی این عملیات رو به پایان رسانید. بخش های بعدی به عهده خودت ...

daniyaltjm
دوشنبه 25 مرداد 1395, 00:13 صبح
باید توجه کنید که فقط کار کردن کد مهم نیست آیا صحیح پیاده سازی صورت گرفته که بعدا دچار مشکل نشوید! در حال حاظر به تعداد گردش حلقه شما دارید شی میسازید در حالی که میشه با یک شی این عملیات رو به پایان رسانید. بخش های بعدی به عهده خودت ...

اره دقیقا مثلا توی این کد 1000 تا شی درست شده حالا کد زیر 500000 شی ساختم که کمی بیشتر رم رو پر میکرد و به این صورت اصلاح شد:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace @for
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
for (int i = 0; i <= 100000; i++)
{
listBox1.Items.Add(i);
}
for (int i = 100001; i <= 200000; i++)
{
listBox1.Items.Add(i);
}
for (int i = 200001; i <= 300000; i++)
{
listBox1.Items.Add(i);
}
for (int i = 300001; i <= 400000; i++)
{
listBox1.Items.Add(i);
}
for (int i = 400001; i <= 500000; i++)
{
listBox1.Items.Add(i);
}
listBox1.SelectedItem = listBox1.Items.Count - 1;
}

private void button2_Click(object sender, EventArgs e)
{
SaveFileDialog sf = new SaveFileDialog();
sf.ShowDialog();
string p = sf.FileName;
FileStream fs = new FileStream(sf.FileName, FileMode.Append, FileAccess.Write);
StreamWriter sw = new StreamWriter(fs);
for (int i = 0; i < listBox1.Items.Count; i++)
{
listBox1.SelectedIndex = i;
sw.WriteLine(listBox1.SelectedItem.ToString());

}

sw.Close();


}
}
}


حالا میشه با گاربج کالکتور خودمون به صورت دستی توی هر چرخه خلقه شی رو پاک کنیم؟ البته می دونم کار اضافه ای هست و با یک شی هم میشه !

Mahmoud.Afrad
دوشنبه 25 مرداد 1395, 01:33 صبح
منظور آقای omid nasri (http://barnamenevis.org/member.php?314072-omid-nasri) رو بد متوجه شدید. در کد قبلی که قرار دادید، در حلقه شئ جدیدی از فایل استریم ایجاد میکردید که کار میکنه ولی بهینه نیست. چون با یک فایل سر و کار دارید، خارج از حلقه ایجاد و بستن استریم و در حلقه فقط عمل نوشتن در فایل را انجام بدید.
در حلقه از Items برای بدست آوردن آیتم استفاده کنید(نیازی به ست کردن SelectedIndex نیست).
SaveFileDialog sf = new SaveFileDialog();
if (sf.ShowDialog() != DialogResult.OK) return;
StreamWriter sw = null;
try
{
var fs = new FileStream(sf.FileName, FileMode.Append, FileAccess.Write);
sw = new StreamWriter(fs);
for (int i = 0; i < listBox1.Items.Count; i++)
{
sw.WriteLine(listBox1.Items[i].ToString());
}
}
finally
{
if (sw != null) sw.Close();
sf.Dispose();
}



در کد آخر نیاز به 5حلقه نیست و میتونید با یک حلقه انجام بدید. میزان استفاده از رم هم به دلیل ایجاد تعداد زیادی آیتم در لیست باکس طبیعی هست.

daniyaltjm
دوشنبه 25 مرداد 1395, 18:44 عصر
در حلقه از Items برای بدست آوردن آیتم استفاده کنید(نیازی به ست کردن SelectedIndex نیست.

چرا نیازه چون در هنگام تولید لیست اعداد، عدد آخر رو نشون میده و ما میتونیم اعداد رو ببینیم که دارن تولید میشن ولی در غیر ایصورت باید منتظر باشیم تا کامل بشه و بعد نمایش میده.

Mahmoud.Afrad
دوشنبه 25 مرداد 1395, 20:58 عصر
چرا نیازه چون در هنگام تولید لیست اعداد، عدد آخر رو نشون میده و ما میتونیم اعداد رو ببینیم که دارن تولید میشن ولی در غیر ایصورت باید منتظر باشیم تا کامل بشه و بعد نمایش میده.

منظورم زمان نوشتن در فایل هست. ست کردن SelectedItem نیازی نیست.