PDA

View Full Version : نحوه کد نویسی جهت ارتباط دو فرم ( لیست اطلاعات و فرم ویرایش)



nasim394
سه شنبه 26 فروردین 1393, 09:56 صبح
سلام.
می خوام یک فرم من لیست اطلاعات نمایش بده (درون گرید)
این کار رو انجام دادم با dataset va binding va data adaptar

فرم دوم برای ویرایش اطلاعات

حالا این ارتباط این دو تا چگونه باشد. تا سرعت بالا باشه ( هم کد نویسی)
دیتا ست را بفرستم به فرم دوم ؟

مشابه عکس زیر118001

Davidd
سه شنبه 26 فروردین 1393, 10:22 صبح
در همون حد كه نياز هست اطلاعات به فرم جديد بفرستيد نه بيشتر و نه كمتر. يه راهش اينه سطح دسترسي ديتاسيت public تعريف كني تا از داخل فرم جديد بتوني بهش دسترسي داشته باشي. اين روش اگرچه درست كار مي كنه اما جالب نيست و توصيه نميشه.
روش ديگه اينه كه اطلاعاتي كه ميخواي بفرستي (مثلا كليد اصلي كد كل بانك) از طريق پارامتر به تابع سازنده فرم جديد ارسال كني. يعني فرم ويرايش اطلاعات يك تابع constructor پارمتر دار داشته باشد.
روش هاي ديگه هم هست

poudineh
سه شنبه 26 فروردین 1393, 10:45 صبح
در همون حد كه نياز هست اطلاعات به فرم جديد بفرستيد نه بيشتر و نه كمتر. يه راهش اينه سطح دسترسي ديتاسيت public تعريف كني تا از داخل فرم جديد بتوني بهش دسترسي داشته باشي. اين روش اگرچه درست كار مي كنه اما جالب نيست و توصيه نميشه.


چرا توصیه نمی شود؟

poudineh
سه شنبه 26 فروردین 1393, 10:47 صبح
روش ديگه اينه كه اطلاعاتي كه ميخواي بفرستي (مثلا كليد اصلي كد كل بانك) از طريق پارامتر به تابع سازنده فرم جديد ارسال كني. يعني فرم ويرايش اطلاعات يك تابع constructor پارمتر دار داشته باشد.
روش هاي ديگه هم هست

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

nasim394
سه شنبه 26 فروردین 1393, 10:54 صبح
با تشکر از شما . دلیل عدم جالب نبودن راه حل اول؟
و راه حل دوم را هم بیشتر توضیح دهید؟ ممنون

Davidd
سه شنبه 26 فروردین 1393, 11:45 صبح
راه حل اول اصول شي گرايي نقض ميكنه. شما فقط به اطلاعات يك سطر نياز داري نه به كل ديتاست.


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

اگه قراره ليست بروز بشه راه حل بهتر اينه كه داخل فرم اصلي يك متد public بنويسي كه اطلاعات يك بانك بگيره و بروز كنه. اطلاعات سطر مورد نظر به فرم جديد ارسال ميكني و در فرم جديد براي ذخيره شده متد فرم اصلي صدا مي زني. اينطوري ليست هم بروز ميشه و نياز به خوندن از ديتابيس نيست.

مثال ( به جاي .... پارامترهاي لازم را بنويسيد يا بهتره يك كلاس مجزا تعرف كنيد و به جاي چندين پارامتر يك پارامتر استفاده كنيد):
class mianForm
{
public void modify(int bankID , ...)
{
//update dataset and save
}
void ShowForm2()
{
(new form2(this,bankId,...).ShowDialog();
}
}

class form2
{
mainForm parent;
public form2(mainForm mform, int bankId, ...)
{
parent=mform;
//fill textboxes from parametrs
}
void save()
{
parent.modify(bankID,...);
}
}

behzadkhan
سه شنبه 26 فروردین 1393, 14:42 عصر
با سلام

شاید روش خوبی باشد:

============================================

در داخل کلاس program.cs یک متغیر استاتیک پابلیک از نوع DataSet تعریف کنید.

ودر هر کجای برنامه با program.DataSet1 بهش دسترسی داشته باشید.

البته توصیه می شه که یک کلاس جدا برای کار با پایگاه داده درست کنید.

================================================

با تشکر

mahtab.kamali
سه شنبه 26 فروردین 1393, 16:12 عصر
سلام.
می خوام یک فرم من لیست اطلاعات نمایش بده (درون گرید)
این کار رو انجام دادم با dataset va binding va data adaptar

فرم دوم برای ویرایش اطلاعات

حالا این ارتباط این دو تا چگونه باشد. تا سرعت بالا باشه ( هم کد نویسی)
دیتا ست را بفرستم به فرم دوم ؟

مشابه عکس زیر118001

دلیلی نداره دیتاست بفرستی :متعجب:
روی هر کدوم از سطرهای گرید که کلیک کردی بعد در رویداد دکمه ای که فرم 2رو باز می کنی مقادیر موجود در هر cellرو به تکست باکس مربوطه در فرم دوم اختصاص می دی به همین راحتی :لبخند:
دیگه این همه زلم زیمبو لازم نداره که :

private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Controls["textBox1"].Text = this.dataGridView1.CurrentRow.Cells[0].Value.ToString();
f2.Controls["textBox2"].Text = this.dataGridView1.CurrentRow.Cells[1].Value.ToString();
f2.Controls["textBox3"].Text = this.dataGridView1.CurrentRow.Cells[2].Value.ToString();
f2.Controls["textBox4"].Text = this.dataGridView1.CurrentRow.Cells[3].Value.ToString();
f2.ShowDialog();
}

Davidd
سه شنبه 26 فروردین 1393, 16:47 عصر
در داخل کلاس program.cs یک متغیر استاتیک پابلیک از نوع DataSet تعریف کنید.
اينكار درست نيست. متغير استاتيك هميشه در حافظه وجود داره. علاوه بر اين خوانايي كد كاهش پيدا مي كنه. اگه قرارا به اين راه حل باشه كه همون راه حل اول كه گفتم بهتره.


دیگه این همه زلم زیمبو لازم نداره که
!!! دوست عزيز هدف فقط نمايش سطر توي فرم ديگه نيست! هدف اينه كه اطلاعات به فرم جديد ارسال بشه و مقادير جديد دريافت بشه و در ديتاست ذخيره بشه

nasim394
چهارشنبه 27 فروردین 1393, 10:29 صبح
دلیلی نداره دیتاست بفرستی :متعجب:
روی هر کدوم از سطرهای گرید که کلیک کردی بعد در رویداد دکمه ای که فرم 2رو باز می کنی مقادیر موجود در هر cellرو به تکست باکس مربوطه در فرم دوم اختصاص می دی به همین راحتی :لبخند:
دیگه این همه زلم زیمبو لازم نداره که :

private void button1_Click(object sender, EventArgs e)
{
Form2 f2 = new Form2();
f2.Controls["textBox1"].Text = this.dataGridView1.CurrentRow.Cells[0].Value.ToString();
f2.Controls["textBox2"].Text = this.dataGridView1.CurrentRow.Cells[1].Value.ToString();
f2.Controls["textBox3"].Text = this.dataGridView1.CurrentRow.Cells[2].Value.ToString();
f2.Controls["textBox4"].Text = this.dataGridView1.CurrentRow.Cells[3].Value.ToString();
f2.ShowDialog();
}

دوستان این روش برای ارسال اطلاعات به فرم جدید خوب است؟؟ ( اصلا برای checkbox و ... جواب نمی دهه)
نحوه برگشت اطلاعات چگونه باشد؟

nasim394
چهارشنبه 27 فروردین 1393, 10:59 صبح
راه حل اول اصول شي گرايي نقض ميكنه. شما فقط به اطلاعات يك سطر نياز داري نه به كل ديتاست.



اگه قراره ليست بروز بشه راه حل بهتر اينه كه داخل فرم اصلي يك متد public بنويسي كه اطلاعات يك بانك بگيره و بروز كنه. اطلاعات سطر مورد نظر به فرم جديد ارسال ميكني و در فرم جديد براي ذخيره شده متد فرم اصلي صدا مي زني. اينطوري ليست هم بروز ميشه و نياز به خوندن از ديتابيس نيست.

مثال ( به جاي .... پارامترهاي لازم را بنويسيد يا بهتره يك كلاس مجزا تعرف كنيد و به جاي چندين پارامتر يك پارامتر استفاده كنيد):
class mianForm
{
public void modify(int bankID , ...)
{
//update dataset and save
}
void ShowForm2()
{
(new form2(this,bankId,...).ShowDialog();
}
}

class form2
{
mainForm parent;
public form2(mainForm mform, int bankId, ...)
{
parent=mform;
//fill textboxes from parametrs
}
void save()
{
parent.modify(bankID,...);
}
}

بسیار عالی . این روش رو امتحان کردم جواب می دهد به جای پارامترها یک کلاس بفرستم (چگونه )
بهتر نیست به جای همه پارامترها یک datarow بفرستم

Davidd
چهارشنبه 27 فروردین 1393, 11:11 صبح
بسیار عالی . این روش رو امتحان کردم جواب می دهد به جای پارامترها یک کلاس بفرستم (چگونه )
بهتر نیست به جای همه پارامترها یک datarow بفرستم

ميشه واسه كل پارامترها يه كلاس تعريف كرد تا كد نويسي تر و تميزتر باشه. اگه با خصوصيات بانك جاهاي ديگه هم سر و كار دارين يه كلاس بانك بسازين بهتره.

datarow هم ميشه فرستاد. datarow چون خودش يك كلاس هست وقتي به صورت پارامتر ارسال ميشه در حقيقت يك ارجاع و اشاره گر ارسال ميشه بنابراين اگه در form2 مقادير datarow تغيير بدين به صورت خودكار در ديتاگريد هم مقادير تغيير ميكنه و نياز به كار ديگه نيست.

nasim394
چهارشنبه 27 فروردین 1393, 11:14 صبح
راه حل اول اصول شي گرايي نقض ميكنه. شما فقط به اطلاعات يك سطر نياز داري نه به كل ديتاست.



اگه قراره ليست بروز بشه راه حل بهتر اينه كه داخل فرم اصلي يك متد public بنويسي كه اطلاعات يك بانك بگيره و بروز كنه. اطلاعات سطر مورد نظر به فرم جديد ارسال ميكني و در فرم جديد براي ذخيره شده متد فرم اصلي صدا مي زني. اينطوري ليست هم بروز ميشه و نياز به خوندن از ديتابيس نيست.

مثال ( به جاي .... پارامترهاي لازم را بنويسيد يا بهتره يك كلاس مجزا تعرف كنيد و به جاي چندين پارامتر يك پارامتر استفاده كنيد):
class mianForm
{
public void modify(int bankID , ...)
{
//update dataset and save
}
void ShowForm2()
{
(new form2(this,bankId,...).ShowDialog();
}
}

class form2
{
mainForm parent;
public form2(mainForm mform, int bankId, ...)
{
parent=mform;
//fill textboxes from parametrs
}
void save()
{
parent.modify(bankID,...);
}
}

بسیار عالی . این روش رو امتحان کردم جواب می دهد به جای پارامترها یک کلاس بفرستم (چگونه )
بهتر نیست به جای همه پارامترها یک datarow بفرستم

مهرداد صفا
چهارشنبه 27 فروردین 1393, 14:21 عصر
با سلام.
لطفا جستجو کنید.
بیشتر از تعداد کلیدهای کیبوردتون این سوال پرسیده شده!!