PDA

View Full Version : ذخیره داده های یک textbox که به صورت dynamic ساخته می شود



daneshjo IT
چهارشنبه 06 آبان 1388, 12:12 عصر
باسلام،

برنامه ای نوشتم که در آن از کاربر تعداد Textbox هایی که می خواهد ساخته شود ، پرسیده شده ، سپس Textbox ها ساخته شده و کاربر می تواند اطلاعاتی را در آن وارد کند و با زدن دکمه Save اطلاعات در یک فایل dat ذخیره میشود. (اطلاعات قبلی فایل نیز حفظ میشود)

مشکل من در ذخیره اطلاعات است ، چگونه می توانم اطلاعات ، textbox هایی که به صورت dynamic ساخته میشوند را ذخیره کنم؟

esmartiz_red
چهارشنبه 06 آبان 1388, 12:33 عصر
کدی که باهاش کنترل می سازی و اینجا بذار

Aidin
چهارشنبه 06 آبان 1388, 13:04 عصر
همه کنترلهای TextBox رو بصورت یک Array از Object ها بساز و مثل یک آرایه هر کدوم رو که می خوای (و یا همه) رو ذخیره کن

saied_genius
چهارشنبه 06 آبان 1388, 15:51 عصر
من نمي دانم دقيقاً به چه صورتي داري textbox ها را مي سازي ولي

با foreach تو فرم بگرد و با نام textbox ها چک کن و text آنها را بخوان.

موفق باشيد.

daneshjo IT
چهارشنبه 06 آبان 1388, 20:26 عصر
برای پیدا کردن Textbox ها با foreach مشکل حل میشود.

در کد زیر که برای قسمت ذخیره نوشتم، می خواهم که کلیه textbox هایی که name آن ها با "txtBox" شروع میشود را در یک فایل dat ذخیره کند ، و اطلاعات قبلی فایل نیز حفظ شود. اما درست ذخیره نمیکند و اطلاعات اولیه فایل هم از دست میرود.




foreach(Control x in this.Controls)
{
if (x is TextBox )
{
if (x.Name == "txtBox")
{
string fname = "F:/a.dat";
System.IO.StreamWriter objWriter;
objWriter = new System.IO.StreamWriter(fname);
objWriter.WriteLine(x);
objWriter.Write(objWriter.NewLine);
objWriter.Close();
}

}

}

saied_genius
چهارشنبه 06 آبان 1388, 21:52 عصر
اينجوري تغييرش بده ، مشکلت حل ميشه


foreach (Control x in this.Controls)
{
if (x is TextBox)
{
if (x.Name == "txtBox")
{
string fname = "F:\\a.dat";
System.IO.FileInfo fi = new System.IO.FileInfo(fname);
System.IO.StreamWriter objWriter = fi.AppendText();
objWriter.WriteLine(x);
objWriter.Write(objWriter.NewLine);
objWriter.Close();
}

}

}

موفق باشيد.

daneshjo IT
چهارشنبه 06 آبان 1388, 22:15 عصر
مشکل حل شد ، فقط برای اینکه textbox هایی را ذخیره کند که نام آن ها با "txtBox" شروع میشود ، چه کاریی باید انجام بدم؟

با if (x.Name == "txtBox") جواب نمی دهد؟

saied_genius
چهارشنبه 06 آبان 1388, 22:22 عصر
اين هم راه حل:


foreach (Control x in this.Controls)
{
if (x is TextBox)
{
if (x.Name.StartsWith("txtBox"))
{
string fname = "F:\\a.dat";
System.IO.FileInfo fi = new System.IO.FileInfo(fname);
System.IO.StreamWriter objWriter = fi.AppendText();
objWriter.WriteLine(x);
objWriter.Write(objWriter.NewLine);
objWriter.Close();
}
}
}


موفق باشيد.

اَرژنگ
پنج شنبه 07 آبان 1388, 03:11 صبح
همه کنترلهای TextBox رو بصورت یک Array از Object ها بساز و مثل یک آرایه هر کدوم رو که می خوای (و یا همه) رو ذخیره کن

اینطوری Type Safety از دست نمیره؟

اَرژنگ
پنج شنبه 07 آبان 1388, 05:01 صبح
حداقل جواب:



private void SaveTextBoxesWithTheirNamestartingWithtxtBox()
{ (from box in this.Controls.OfType<TextBox>()
where box.Name.StartsWith("txtBox")
select box).ToList<TextBox>().ForEach(f => SaveToFile(f, "F:\\a.dat"));
}

private void SaveToFile(object obj, string fileName)
{
System.IO.FileInfo fi = new System.IO.FileInfo(fileName);
using( System.IO.StreamWriter streamWriter = fi.AppendText() )
{
streamWriter.WriteLine(obj);
streamWriter.Write(streamWriter.NewLine);
}
}
اشکالات جوابهایه پیشین:
ا.نداشتن ایمنی نوع Type Safety
۲.بسته نشدن StreamWriter اگر با اکسپشن مواجه بشیم
۳.باعث بالا بردن اطلاعات کاربران نمیشه، از روشی که شخصا استفاده میکنیم کمتر نباید فرستاد، تازه‌کارها قابلیت یادگیری بهترین روشها را دارند، باید از بهترین جوابی که در زمان کنونی موجود است کمتر بهشان ندیم.
۴.استفاده از foreach دیگر قدیمی شده، استفاده از لامبدا اکسپرشن را به استفاده از ترجیح بدیم.

اشکالات این جواب:
۱.این یک روش شئیگرائی نیست، فقط با صدا زدن متدها کاری را انجام میده
۲.بدانه دانستن دلیل اینکه چرا یکی میخواهد مقدایر تکست باکسهایی را که با یک رشته بخصوص شروع میشند را ذخریه کنه، یک جواب سمبل شده که با روشهایه اصولی که میشه برایه حل مشکل واقعی استفاده بشه مغایرت دارد.

برتریهایه این جواب:
۱.قابل استفاده بودن از هر فرمی ، دوباره تمام منطق را کد نمیکنیم.
۲.مونولیتیک نیستش، یعنی اینکه یک چیز گنده را به هم نبافتیم، قابلیت استفاده شدن برایه کارهایه دیگر را به دست میده.

اگر هر کسی اشکالی برایه این جواب به فکرش بیاد لطفاً از ما دریغ نکنید، اگر این جواب جایه سوالی باز میکند لطفاً بپرسید.

daneshjo IT
پنج شنبه 07 آبان 1388, 12:33 عصر
از پاسخ کاملی که دادین ، تشکر میکنم .

اگر بخواهم که فایل a.dat را درجایی قرار بدهم که Exe برنامه در آن جا قرار دارد ، چه کاری باید انجام دهم؟! (یعنی همیشه اول جایی که exe برنامه قرار دارد را پیدا کند و سپس فایل Dat را در آن جا ذخیره کند)

saied_genius
پنج شنبه 07 آبان 1388, 12:41 عصر
Application.StartupPath + "\\a.dat";

موفق باشيد.

daneshjo IT
پنج شنبه 07 آبان 1388, 12:50 عصر
در رابطه با کدی که نوشتید:

چرا از 2 تا تابع استفاده کردید؟!
1) ذخیره اطلاعات textbox و ریختن در فایل a.dat
2) تابع ذخیره در فایل که 2 تا مقدار میگیرد.

کلا در رابطه با این کاری که انجام دادین بیشتر توضیح دهید.

کد نهایی که من در برنامه قرار دادم در ادامه نوشتم:
*streamwrite هم در انتهای برنامه بسته شده است.
*مشکلات دیگری هم که از نظر شما وجود دارد ، لطفا بر روی کد توضیح دهید ،
( لطفا اصطلاحاتی که استفاده میکنید را انگلیسی تایپ کنید)

باتشکر،




private void buttonsave_Click(object sender, EventArgs e)
{
string fname = Application.StartupPath + "\\a.dat";
System.IO.StreamWriter objWriter;
objWriter = new System.IO.StreamWriter(fname , true);

foreach(Control x in this.Controls)
{
if (x is TextBox)
{
objWriter.WriteLine(x.Text);
objWriter.Write(objWriter.NewLine);
}
}
objWriter.Close();
}