1398-09-10 20:35 فرم ویرایش کاربر به همراه چندین Usercontrol
booysusa

 
با درود خدمت همگی اعضای انجمن به ویژوه مهندش حاجی شریفی گرامی

همانطور که اطلاع دارید برنامه من اینگونه بود که در ابتدا با زدن فرم مخاطب جدید یک فرم باز میشد که اطلاعات اولیه مخاطب را دریافت می کرد و ذخیره میکرد و سپس کاربر با زدن مشاهده و تکمیل اطلاعات میتونست اطلاعات بیشتری مانند عکس ها، مدارک و سایر اطلاعات را برای مخاطب ذخیره کند
چون پروژه قبل من به زبان Ado بود این کار را انجام دادم ولی در پروژه جدید که از تکنولوژی entity استفاده میکنم شیوه ویرایش و تکمیل اطلاعات کاربر (دریافت اطلاعات از دیتاگرید ویو (دیتابیس) و درج آنها در فیلدهای مورد نظر(مثلا تکست باکس ها و رادیو باتن ها و تصاویر) ) را نمی دانم

و اینکه چون در frmEditContact اطلاعات و فیلدها و دیتاگرید ویو های زیادی هست و درج همه آنها در یک فرم با استفاده از Panel شاید زیاد کار درستی نباشد
از این رو میخواهم هر فرم را در یک Usercontrol قرار بدم و همه Usercontrolها را درون یک frmEditContact قرار بدم

قبلا در انجمن یه همچین چیزی انجام دادیم ولی هرکاری کردم نشد پیداش کنم

ایمدوارم سوالم روشن بوده باشه (سعی کردم خوب توضیح بدم ولی میدونم کمی گنگ بود)

راهکار این چی هست؟
با سپاس فراوان
1398-09-12 10:07
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: booysusa
چون پروژه قبل من به زبان Ado بود این کار را انجام دادم ولی در پروژه جدید که از تکنولوژی entity استفاده میکنم شیوه ویرایش و تکمیل اطلاعات کاربر ... را نمی دانم

اینکه شما چطور به دیتابیس متصل میشوید نباید تفاوت زیادی در UI داشته باشد.
شما قبل تر ، شبه کدی مانند این برای درج در دیتابیس داشته اید...
void DBInsert(row)
{
var comm = new ...
comm.sql = "INSERT INTO mytable ...
comm.param.add(row.field1);
comm.param.add(row.field2);
comm.param.add(row.field3);
comm.excute(..
}


حالا میتوانید شبه کدی مانند این داشته باشید.
void DBInsert(row)
{
EFDbContext.mytable.Add(row) ;
EFDbContext.SaveChanges() ;
}


خلاصه آنکه، یعنی از بابت استفاده از EF نیاز به تغییر خیلی عظیمی در UI ندارید.
( میتوان ایده هایی برای معماری UI و ارتباط بهتر آن با لایه دیتابیس داد، مانند معماری MVVM ولی این بحث دیگری است و نحوه ارتباط با دیتابیس در این مسائل چندان مهم نیست )

نقل قول نوشته شده توسط: booysusa
چون در frmEditContact اطلاعات و فیلدها و دیتاگرید ویو های زیادی هست و درج همه آنها در یک فرم با استفاده از Panel شاید زیاد کار درستی نباشد ... هر فرم را در یک Usercontrol قرار بدم ...

اما اینکه خودتان صلاح میدانید که به نحوه دیگری در UI عمل کنید و عناصر را طور دیگری چیدمان کنید تا برای کاربر راحت تر باشد و برنامه هم سرعت بهتری داشته باشد، خوب این بحث دیگری است.

اینطورکه متوجه شدم، چیزی که توضیح میدهید، آن است که میخواهید محتویات هر TabPage را یک Usercontrol کنید !؟
و درنهایت همه Usercontrol ها را با هم روی یک Form آورده و استفاده کنید !؟

متاسفانه نمیدانم دقیق کجا را مشکل دارید ولی طبق حدس توضیحات و ایده هایی میدهم !
هر Usercontrol شما میتواند دو تابع DBLoad و DBSave داشته باشد که مقادیری هم بگیرد.
بطور نمونه با پارامترهایی شبیه این:
// Usercontrol-X 
private long m_PrimaryKey ;

public void DBLoad(MYEFDBCONTEXT db, long primaryKey)
{
this .m_PrimaryKey = primaryKey;
if (primaryKey > 0)
{
// read from db to edit data
}
else
{
// set default values to insert data
}
}

public void DBSave(MYEFDBCONTEXT db)
{
// any code !
}


حال در Load و Save کلاس Form اصلی برنامه ( همان frmEditContact ) میتوانید تک تک توابع فوق هر Usercontrol را اجرا کنید.
// frmEditContact 
private long m_PrimaryKey ;
private MYEFDBCONTEXT m_DBContext ;

public void MainFormLoad(long primaryKey)
{
// try ... catch ... messageBox ...

this .m_PrimaryKey = primaryKey ;
this .m_DBContext = new MYEFDBCONTEXT(... ;
// any code !

this .Usercontrol1.DBLoad(this .m_DBContext, this .m_PrimaryKey) ;
this .Usercontrol2.DBLoad(this .m_DBContext, this .m_PrimaryKey) ;
this .Usercontrol3.DBLoad(this .m_DBContext, this .m_PrimaryKey) ;
}

private void MainFormSave()
{
// try ... catch ... messageBox ...

this .Usercontrol1.DBSave(this .m_DBContext) ;
this .Usercontrol2.DBSave(this .m_DBContext) ;
this .Usercontrol3.DBSave(this .m_DBContext) ;
// any code !

this .m_DBContext.SaveChanges() ;
this .m_DBContext.Dispose() ;
}


امیدوارم کمکی کرده باشم
موفق باشید.
1398-09-22 17:48
booysusa

 
با درود خدمت همه دوستان بویژه مهندس شریفی گرامی

سپاس فراوان بابت توضیحاتتون
برنامه ای ساده نوشتم و سعی کردم بر اساس مطالبی که در پست قبلی بهش اشاره کردید پیش ببرم، چیزی که الان درش گیر افتادم همان ریلیشن شیپ هست که الان روش نوشتن EF رابطه ها رو خوب بلد نیستم، برای همین در این دفترچه تلفن سعی کردم یاد بگیرم

نوع کدنویسی که گفتید و چیزی که من یاد گرفتم رو در این برنامه ساده پیاده کردم ولی الان در مورد رابطه ها کمی مشکل دارم

اگر امکانش هست برنامه را دانلود و مشاهده کنید
لینک دانلود

1. مشکل اولم در بحث آوردن عکس و کدملی در کنار گرید ویو هست (مثلا وقتی مخاطبی انتخاب یا همان سلکت می شود باید تصویرش و کدملی آن در کنار گریدویو نماش داده شود)

2. در زمان زدن دکمه تکمیل اطلاعات در فرم اصلی، زمانی که فرم ویرایش یا همان تکمیل اطلاعات باز میشود و اطلاعات لود میشود با روش سابق که همان کد نویسی ADO بود مشکلی نداشتم ولی با EF دقیق نمیدانم چطوری با بهترین و ساده ترین روش اطلاعات را در فرم ویرایش لود کنم در تکست باکس ها، گرید ویوها و...

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

4. شیوه ذخیره تصاویر و فایل هایی مانند پی دی اف و وورد و سایر اسناد را نمی دانم ، البته با ADO من شیوه ذخیره تصاویر را می دانم


امیدوارم نوشته هایم گویا باشند
لطفا در صورت امکان یک نگاه به برنامه بگنید و کدها را اصلاح کنید تا بتوانم ادامه دهم
بشدت منتظر شما هستم زیرا در این زمان کاملا متوقف شدم

بی نهایت سپاسگزارم
1398-09-22 21:53
حاجی شریفی
مؤسس سایت
 
نگاه کوتاهی به کد کردم ...
چند نکته ...

اول آنکه تلاش کنید کمی مجزا تر و ایزوله تر کد بنویسید.
مگر کلاس Hesab معرف یک سطر/Row دیتابیس نیست ؟!
وظیفه این کلاس درست شبیه کلاس Contact است.
کلاس Contact تان خیلی خوب و تمیز است.
ولی چرا در کلاس Hesab این همه متد و کارهای بی ارتباط با یک سطر درحال انجام است ؟!

جای متدهایی مانند AddHesab و UpdateHesab و DeleteHesab و GetAllHesab که در سطر دیتابیس نیست.
چرا باید یک سطر دیتابیس متد GetAll داشته باشد ؟!
این متدها باید در محل جداگانه و یا حداقل در کلاس DbContext باشد.
شی DbContext نقش unit-work دارد و میتواند متدی مانند GetAll داشته باشد و...

در آخر آنکه کنترلر GlobalizationDateTimePicker خودش تبدیل تاریخ دارد کافی است از خصیصه Value استفاده کنید.
این کنترلر میتواند اشکال پیچیده ای از تاریخ را نشان دهد که متد ساده ToGeorgianDateTime توان تبدیل آن را ندارد ( مانند "22 آذر 1398" یا 13980922 یا "جمعه 22 آذر ماه 98" و... )
DateTime tarikh = mskTarikh_Hesab.Text.ToGeorgianDateTime() ; 
DateTime tarikh = mskTarikh_Hesab.Value ;


و سوال اصلی اینکه رابطه Contact و Hesab چطور است؟ آیا یک Contact باید چند Hesab داشته باشد؟
اگر چنین است Hesab باید یک کلید خارجی Contact_Id داشته باشد.

سوال آخر را جواب دهد، کمی گرفتاری دارم ولی تلاش میکنم زودتر سورس تان را اصلاح کرده و برایتان آپلود کنم.
موفق باشید.
1398-09-24 16:48
booysusa

 
با درود و سپاس بابت وقتی که گذاشتید برای بررسی

نقل قول
کلاس Contact تان خیلی خوب و تمیز است.

سپاس

نقل قول
اول آنکه تلاش کنید کمی مجزا تر و ایزوله تر کد بنویسید.

سپاس که این نکته هارو میگید، سعی میکنم هر مطلبی که مینویسید رو جستجو کنم

نقل قول
جای متدهایی مانند AddHesab و UpdateHesab و DeleteHesab و GetAllHesab که در سطر دیتابیس نیست.

این روش را برای این نوشتم زیرا فعلا فقط این روش را فرا گرفتم، ازاین همه شلوغی خستم ولی راه بهتری فعلا آموزش نگرفتم و کدی ندیدم که بتوانم درکش کنم (دنبال راه بهتری هستم در صورت امکان لطفا همان شیوه که مناسب هست را بنویسید)

نقل قول
شی DbContext نقش unit-work دارد و میتواند متدی مانند GetAll داشته باشد و...

واقعیتش GetAll رو برای این نوشتم که من ممکنه از یک جدول فقط ستون نام و نام خانوادگیش رو بخواهم، از این طریق می توانم فقط مواردی که میخواهم را در گرید ویو نمایش دهم



نقل قول
در آخر آنکه کنترلر GlobalizationDateTimePicker خودش تبدیل تاریخ دارد کافی است از خصیصه Value استفاده کنید.

نگرانی من در مورد شیوه نمایش پارسی تاریخ در گرید ویو و فرم ویرایش هست، برای همین از متد ToGeorgianDateTime استفاده کردم




نقل قول
و سوال اصلی اینکه رابطه Contact و Hesab چطور است؟ آیا یک Contact باید چند Hesab داشته باشد؟
اگر چنین است Hesab باید یک کلید خارجی Contact_Id داشته باشد.


بله هر کاربر ممکن است یک روز بستنی سر حساب برده باشد، یک روز قند سر حساب برده باشد و...


و همچنین یک مشکل اساسی که من دارم کار با تصاویر هست، ذخیره استاندارد و همچنین نامگذاری و نمایش در گریدویو و...

با سپاس فراوان
1398-09-30 01:18
حاجی شریفی
مؤسس سایت
 
سلام
عضرخواهی میکنم، خیلی درگیر بودم
( احتمالا هفته آینده سامانه هریم فعال خواهد شد و کمی سرمان را شلوغ کرده ... )

نمایه UI کنترلر uclEtelaatPayeh و frmNewContact را کمی ویرایش کردن تا responsive تر باشد.
یعنی الآن با کوچک و بزرگ کردن برنامه ، UI بهم نمیخورد.

نمایش و ذخیره تصویر را هم درست کردم
الآن با حرکت در Grid تصویر در کنار نمایش داده میشود.

فرم frmNewContact را طوری تغییر دادم که هم کار New و هم Edit را با هم انجام دهد.
ولی نامش را عوض نکردم

رابطه Relation بین دو موجودیت هم به درستی برقرار شده و دیتابیس هم صحیح ایجاد میشود.
ولی در مورد UI افزودن و ویرایش Hesab کاری انجام ندادم.

الگوها و روش ارتباط فرم ها و UserControl و یکپارچکی ظاهر و عملکرد Button ها و... را خیلی جا برای تغییر و عملکرد بهتر داشت ولی تمام تلاشم را کردم ، کد خودتان را کمتر تغییر دهم تا متوجه تغییرات بشوید و اینطور نباشد که یکباره با یک کد و پروژه جدید روبرو شوید !

لازم بذکر است در frmEditContact و uclHesab و uclPictures تغییرات خاصی اعمال نکردم.

در نهایت جهت کاهش حجم بسته در آپلود و دانلود ، dll های EF حذف شده اند و مشکلی نیست! کافیست در زمان بازکردن پروژه اینترنت تان وصل باشد تا خود VS فایل فوق را از رایانه خودتان و یا اینترنت دانلود و در محل مناسب کپی کند.

نقل قول نوشته شده توسط: booysusa
مشکل اولم در بحث آوردن عکس و کدملی در کنار گرید ویو هست

انجام شد، سورس جدید را ملاحظه کنید.

نقل قول نوشته شده توسط: booysusa
در زمان زدن دکمه تکمیل اطلاعات در فرم اصلی، ... ساده ترین روش اطلاعات را در فرم ویرایش لود کنم در تکست باکس ها، گرید ویوها و...

بهترین راه انقیاد داده یا همان Binding است، این روش در WinForm هم وجود دارد اما در پروژه های جدید WPF به حد کمال رسید.
ولی در حال حاضر با همان کدهای ساده x = y و مشابه کدهای قبلی خودتان کار را انجام دادم !!!

نقل قول نوشته شده توسط: booysusa
شیوه ذخیره کردن اطلاعات وارد شده در فرم ویرایش را به نحوی که ... با زدن ثبت هر کدام، در دیتابیس ذخیره بشوند با روش EF دقیق نمی دانم

خیلی شبیه همان شرایط کدهای قبلی تان که دیده بودم، کد جدید را برایتان نوشتم.
ولی همین کد فعلی که برایتان نوشتم هم خیلی خوب نیست، باید DbContext بیشتر حفظ شود و از تعداد دکمه های متعدد کاسته شود.
حالا ببینید تا اینجای کار را متوجه میشوید ومشکلی ندارید، بعد اگر مشکلی نبود میتوان یک پله کار را ارتقاء داد.

نقل قول نوشته شده توسط: booysusa
شیوه ذخیره تصاویر و فایل هایی مانند پی دی اف و وورد و سایر اسناد را نمی دانم ، البته با ADO من شیوه ذخیره تصاویر را می دانم

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

EF6WindowsFormsSample
موفق باشید.
1398-10-05 20:35
booysusa

 
با درود
بی نهایت سپاس مهندس شریفی
این چند روز در حال تکمیل اجزای مختلف برنامه با روش شما بودم

مهندس الان میخوام با استفاده از UserControl هایی که بر روی فرم ویرایش کاربر ( که الان با توجه به آموزش شما هر دو فرم یعنی فرم ثبت کاربر جدید و فرم ویرایش یک فرم هستند ) گذاشتم همه اطلاعات رو درج کنم، مثلا قسمت اطلاعات اولیه و همچنین قسمت دانشگاه یا اسکن مدارک یا... در بخش اطلاعات اولیه مشکلی نیست و با روش شما به درستی پیش رفتم و اطلاعات رو هم ذخیره و هم لود کردم، ولی وقتی میخوام برای باقی UserControl ها اطلاعات وارد کنم و ذخهیر کنم به خطا بر میخورم، قطعا بخاطر رابطه ها هست

قسمتی که چند UserControl بر روی فرم قرار دادم و با زدن دکمه ثبت اطلاعات همگی ثبت جدید یا ویرایش میشود

رابطه بین این UserControl رو چطوری برقرار کنم؟

این هم کد ذخیره مثلا بخش گواهی ها هست
public bool DbSave()
{
try
{
using (var context = new SimorghContext())
{
Govahiha row ;

if (this.m_Contact_ID > 0)
{
//UPDATE
row = context.Govahihas.Find(this.m_Contact_ID) ;
if (row == null) return false ;
}
else
{
//INSERT
row = new Govahiha() ;
}

row.SerialKartMeli_KartMeli = txtSerialKartMeli_KartMeli.Text ;
if (rdoJadidSerial_KartMeli.Checked)
{
row.NoeKartMeli = true ;
}
else if (rdoGhadimSerial_KartMeli.Checked)
{
row.NoeKartMeli = false ;
}

row.SerialKartMeli_KartMeli2 = txtSerialKartMeli_KartMeli2.Text ;
if (rdoJadidSerial_KartMeli2.Checked)
{
row.NoeKartMeli2 = true ;
}
else if (rdoGhadimSerial_KartMeli2.Checked)
{
row.NoeKartMeli2 = false ;
}

//context.Entry(row).Property(r => r.m_Contact_ID).IsModified = true ;

context.Entry(row).State = this.m_Contact_ID > 0 ? EntityState.Modified : EntityState.Added ;
context.SaveChanges() ;
this.m_Contact_ID = row.Id ;
}
FarsiMessageBox.MessageBox.Show( "اطلاع", "با موفقیت ذخیره شد", FarsiMessageBox.MessageBox.Buttons.OK, FarsiMessageBox.MessageBox.Icons.Information ) ;
return true ;
}
catch
{
FarsiMessageBox.MessageBox.Show( "اخطار", "عملیات انجام نشد", FarsiMessageBox.MessageBox.Buttons.OK, FarsiMessageBox.MessageBox.Icons.Error ) ;
return false ;
}
}


البته این هم کد بخش ثبت اطلاعات اولیه هست که به درستی ذخیره میشن اطلاعات ولی فقط اطلاعات اولیه به درستی ذخیره میشن و باقی بخش ها ذخیره نمیشن و خطا میده برنامه
public bool DbSave()
{
try
{
if (string.IsNullOrEmpty(txtName_EtelaatAvaliyeh.Text))
{
MessageBox.Show( "نام مخاطب وارد کنید " ) ;
return false ;
}

using (var context = new simorghContext())
{
Contact row ;

if (this.m_Contact_ID > 0)
{
//UPDATE
row = context.Contacts.Find(this.m_Contact_ID) ;
if (row == null) return false ;
}
else
{
//INSERT
row = new Contact() ;
}

row.Name = txtName_EtelaatAvaliyeh.Text ;
row.TarikhTavalod = mskTarikhTavalod_EtelaatAvaliyeh.Value ;

context.Entry(row).State = this.m_Contact_ID > 0 ? EntityState.Modified : EntityState.Added ;
context.SaveChanges() ;
this.m_Contact_ID = row.Id ;
}
FarsiMessageBox.MessageBox.Show( "اطلاع", "مخاطب با موفقیت ذخیره شد", FarsiMessageBox.MessageBox.Buttons.OK, FarsiMessageBox.MessageBox.Icons.Information ) ;
return true ;
}
catch
{
FarsiMessageBox.MessageBox.Show( "اخطار", "عملیات انجام نشد", FarsiMessageBox.MessageBox.Buttons.OK, FarsiMessageBox.MessageBox.Icons.Error ) ;
return false ;
}
}

مهندس اگر مشکل از طرابه هست چطوری رابطه رو ایجاد کنم؟ اگر بنویسید بزرگواری میکنید
با سپاس فروان
1398-10-05 22:11
حاجی شریفی
مؤسس سایت
 
سلام
public bool DbSave()
{
try
{
using (var context = new SimorghContext())
{
Govahiha row ;

if (this.m_Contact_ID > 0)
{
//UPDATE
row = context.Govahihas.Find(this.m_Contact_ID ) ;
....

در کد فوق واقعا که منظورتان Contact_ID نبوده؟! چون باید نامی شبیه Govahiha_ID اینجا باشد!
احتمالا کد را Copy/Paste کرده اید و تغییر نام نداده اید و واقعا منظورتان همان Govahiha_ID بوده ؟!

نقل قول نوشته شده توسط: booysusa
رابطه بین این UserControl رو چطوری برقرار کنم؟

در ساده ترین حالت ممکن با جابجایی و پاس کاری ID نفر (همان Contact_ID) باید UserControl تان بتوانند با هم کار کنند.

نقل قول نوشته شده توسط: booysusa
چطوری رابطه رو ایجاد کنم؟

اگر قرار است هر یک نفر(Contact) چندین گواهی(Certificate یا همان Govahiha خودتان ) داشته باشد، از نظر دیتابیسی که جدول گواهی شما باید یک فیلد Contact_ID داشته باشد.

از زاویه EF هم مدلتان چیزی شبیه این میشود.
public class  Contact
{
// سایر فیلدهای قبلی

public virtual ICollection<Certificate> Certificates { get ; set ; }
}

public class Certificate
{
// سایر فیلدهای قبلی
public int Contact_ID { get ; set ; }

public virtual Contact Contact { get ; set ; }
}


برای کدنویسی هم کافیست ID نفر را (همان Contact.ID) جایی منتقل کنید و در Certificate.Contact_ID پرکنید، تا این رابطه به سادگی برقرار گردد.
//INSERT 
certificate_or_gavahi_row.Contact_ID = person_contact_id ;


امیدوارم توانسته باشم جواب سوال تان را بدهم.
موفق باشید.
1398-10-06 19:42
booysusa

 
با درود
مهندس حاجی شریفی ببخشید که با سولات مبتدی ام وقت شما بزرگوار رو میگیرم

برنامه به این شکل هست که برای هر نفر یک سری اطلاعات میگیره
مثلا ممکنه علی محمدی اطلاعات اولیه و اطلاعات دانشگاه و هم اسکن آزمایشاتش رو بخواهیم ذخیره کنیم

من با روش ADO ایجاد روابط رو میتونم انجام بدم ولی با EF مشکل دارم، برای همین کدهای ایجاد کننده دیتابیس رو اینجا ارسال میکنم


و همچنین الان مشکلم اینه که دارم جدا جدا کدهارو توی UserControl درج میکنم
یعنی اطلاعات اولیه یک UserControl دارد
اسکن آزمایشات یک UserControl دارد
اطلاعات دانشگاه یک UserControl دارد
حالا تمام این UserControl ها رو بر روی یک فرم به نام frmUser قرار دادم

الان باید رابطه بین هر کدام از این UserControl ایجاد کنم

مشکلم نوشتن کدهاش هست

این کدهای EF دیتابیسم برای جدول Govahiha هست
public class Govahiha
{
[Key]
public int Id { get ; set ; }
public int Contact_ID { get ; set ; }
public string SerialKartMeli_KartMeli { get ; set ; }
public bool NoeKartMeli { get ; set ; }

public virtual Contact Contact { get ; set ; }
}


این هم کدهای EF دیتابیسم برای جدول Govahiha هست
public class Contact
{
// اطلاعات پایه در هنگام اولین افزودن
/// <summary>
/// آیدی جدول کانتکت
/// </summary>
[Key, DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int Id { get ; set ; }

/// <summary>
/// نام - اطلاعات اولیه
/// </summary>
[MaxLength(70)]
public string Name { get ; set ; }

/// <summary>
/// نام خانوادگی - اطلاعات اولیه
/// </summary>
[MaxLength(70)]
public string NameKhanevadegi { get ; set ; }

public virtual ICollection<Govahiha> Govahihas { get ; set ; }
}



اینم هم کدهای EF بخش Contact که زیر UserControl که برای درج اطلاعات بخش اطلاعات اولیه بر روی frmUser قرار گرفته است
public bool DbSave()
{
try
{
if (string.IsNullOrEmpty(txtName_EtelaatAvaliyeh.Text))
{
MessageBox.Show("نام مخاطب وارد کنید") ;
return false ;
}

using (var context = new CafeContext())
{
Contact row ;

if (this.m_Contact_ID > 0)
{
//UPDATE
row = context.Contacts.Find(this.m_Contact_ID) ;
if (row == null) return false ;
}
else
{
//INSERT
row = new Contact() ;
}

row.Name = txtName_EtelaatAvaliyeh.Text ;
row.NameKhanevadegi = txtNameKhanevadegi_EtelaatAvaliyeh.Text ;

context.Entry(row).State = this.m_Contact_ID > 0 ? EntityState.Modified : EntityState.Added ;
context.SaveChanges() ;
this.m_Contact_ID = row.Id ;
}
FarsiMessageBox.MessageBox.Show("اطلاع", "مخاطب با موفقیت ذخیره شد", FarsiMessageBox.MessageBox.Buttons.OK, FarsiMessageBox.MessageBox.Icons.Information) ;
return true ;
}
catch
{
FarsiMessageBox.MessageBox.Show("اخطار", "عملیات انجام نشد", FarsiMessageBox.MessageBox.Buttons.OK, FarsiMessageBox.MessageBox.Icons.Error) ;
return false ;
}
}


اینم هم کدهای EF بخش Govahiha که زیر UserControl که برای درج اطلاعات بخش گواهی ها بر روی frmUser قرار گرفته است
public bool DbSave()
{
try
{
if (string.IsNullOrEmpty(txtSerialKartMeli_KartMeli.Text))
{
MessageBox.Show("نام مخاطب وارد کنید") ;
return false ;
}

using (var context = new CafeContext())
{
Govahiha row ;

if (this.m_Govahiha_ID > 0)
{
//UPDATE
row = context.Govahihas.Find(this.m_Govahiha_ID) ;
if (row == null) return false ;
}
else
{
//INSERT
row = new Govahiha() ;
row.Contact_ID = m_Govahiha_ID ;

}

row.SerialKartMeli_KartMeli = txtSerialKartMeli_KartMeli.Text ;
if (rdoJadidSerial_KartMeli.Checked)
{
row.NoeKartMeli = true ;
}
else if (rdoGhadimSerial_KartMeli.Checked)
{
row.NoeKartMeli = false ;
}

row.SerialKartMeli_KartMeli2 = txtSerialKartMeli_KartMeli2.Text ;
if (rdoJadidSerial_KartMeli2.Checked)
{
row.NoeKartMeli2 = true ;
}
else if (rdoGhadimSerial_KartMeli2.Checked)
{
row.NoeKartMeli2 = false ;
}
//row.ShomarehMeli = txtShomarehMeli_EtelaatAvaliyeh.Text ;
//row.Taahol = cmbNooZanashoii_EtelaatAvaliyeh.Text ;
//row.TarikhTavalod = mskTarikhTavalod_EtelaatAvaliyeh.Value ;

//context.Entry(row).Property(r => r.m_Contact_ID).IsModified = true ;

context.Entry(row).State = this.m_Govahiha_ID > 0 ? EntityState.Modified : EntityState.Added ;
context.SaveChanges() ;
this.m_Govahiha_ID = row.Id ;
}
FarsiMessageBox.MessageBox.Show("اطلاع", "با موفقیت ذخیره شد", FarsiMessageBox.MessageBox.Buttons.OK, FarsiMessageBox.MessageBox.Icons.Information) ;
return true ;
}
catch
{
FarsiMessageBox.MessageBox.Show("اخطار", "عملیات انجام نشد", FarsiMessageBox.MessageBox.Buttons.OK, FarsiMessageBox.MessageBox.Icons.Error) ;
return false ;
}
}
1398-10-08 11:06
booysusa

 
درود به همگی به ویژه مهندس حاجی شریفی گرامی

ببخشید مهندس تو سوال قبلی هنوز حل نشده، سوال بعدی پیش اومد

با کد زیر وقتی میخوام اطلاعات UserControl رو در فرم ها لود و ویرایش کنم مشکلی نداره ولی وقتی میخوام مثلا فرم جدیدی رو (بدون استفاده از UserControl ) لود و ویرایش کنم حس میکنم این کدی که میزنم برای لود فرم درست نیست چون هیچ فرمی رو باز نمی کنه
private void btnEditShow_Click(object sender, EventArgs e)
{
//frmEditContact frec = new frmEditContact() ;
//frec.ShowDialog() ;
//LoadContact() ;

//کد جدید مهندس شریفی
var row = this.GetDataGridCurrentRow() ;
if (row == null) return ;

using (var f = new frmNewContact())
{
f.DbLoad(row.Id) ;
f.ShowDialog(this) ;
}

this.LoadData() ;
}


آیا این کد بالا فقط برای UserControl جواب میده؟

کد زیر هم که برای دریافت اطلاعات دیتابیس جدول مورد نظر هست
private Models.Jadvalha.DaftarchehTelefon GetDataGridCurrentRow()
{
return this.m_BindingSource.Current as Models.Jadvalha.DaftarchehTelefon ;
}


اینم کد ذخیره اطلاعات هست
public bool DbLoad(int daftarchehtelefon_ID)
{
try
{
Models.Jadvalha.DaftarchehTelefon row ;
if (daftarchehtelefon_ID > 0)
{
using (var context = new simorghContextt())
row = context.DaftarchehTelefons.Find(daftarchehtelefon_ID) ;

if (row == null) return false ;
}
else
{
row = new Models.Jadvalha.DaftarchehTelefon() ;
}

this.m_DaftarchehTelefon_ID = row.Id ;
this.txtName.Text = row.Name ;

return true ;
}
catch
{
return false ;
}
}


بی نهایت سپاسگزارم مهندس حاجی شریفی گرامی
1398-10-09 12:58
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: booysusa
مشکلم نوشتن کدهاش هست

به نظر میرسد، باید همان پروژه را تکمیل تر کنم و مجدد برایتان ارسال کنم
ولی الآن تا یک ما آتی خیلی درگیر هستم ...
اجازه دهید ببینم میتوانم خیلی کوتاه بخش "گواهی" تان را درست کنم ... همان کد قبلی را ویرایش کنم خوب است؟!

نقل قول نوشته شده توسط: booysusa
ولی وقتی میخوام مثلا فرم جدیدی رو (بدون استفاده از UserControl ) لود و ویرایش کنم حس میکنم این کدی که میزنم برای لود فرم درست نیست

سوال کمی گنگ است ... کلا پاسخی میدهم انشاا... مفید باشد.
این کد که خیلی ساده است، سطر انتخاب شده DataGrid را یافته و ID آن سطر را به frmNewContact تحویل میدهد.

هر کجا Edit/Modify/Update بر مبنای سرجاری DataGrid دارید، میتوانید این کار را انجام دهید و نهایت بجای frmNewContact باید نام فرم دیگری را قرار دهید.

ولی اگر هدف Add/New/Insert است ، پس دیگر نیاز به دستورات سطر انتخاب شده DataGrid و یافتن ID و... نیست.
و در این حالت دستور شما به کد ساده ای مانند این محدود میشود
private void  btn_ADD_NEW_INSERT_Click(object  sender, EventArgs e)
{
using (var f = new frmNewContact())
{
f.ShowDialog(this ) ;
}

this .LoadData() ;
}


موفق باشید.
1398-10-10 08:38
booysusa

 
درود و سپاس مهندس حاجی شریفی گرامی
با عرض پوزش:

نقل قول
با کد زیر وقتی میخوام اطلاعات UserControl رو در فرم ها لود و ویرایش کنم مشکلی نداره ولی وقتی میخوام مثلا فرم جدیدی رو (بدون استفاده از UserControl ) لود و ویرایش کنم حس میکنم این کدی که میزنم برای لود فرم درست نیست چون هیچ فرمی رو باز نمی کنه

این یکی رو درست کردم متوجه شدم مشکلم کجاست

سپاس
1398-10-14 23:50
حاجی شریفی
مؤسس سایت
 
سلام
همان سورس قبلی تان را در حد وقتم کمی ویرایش کردم.

با توجه به اینکه منظور شما از Govahiha نوعی از اطلاعات یک به یک با Contact است، هرچه با خودم تلاش کردم راضی نشدم رابطه آنها را یک به چند کنم!
آخر مگر یک Contact چند SerialKartMeli یا چند NoeKartMeli دارد؟
ولی بجای عمل نازیبای فوق ( رابطه یک به چند بین Govahiha و Contact با مفهوم فوق ) دوکار برایتان انجام دادم.

اول) چند فیلد دیگر به Contact اضافه کردم و آن TabPage جا مانده از دفعه قبل را فعال کردم ( تاهل و تاریخ ثبت و... )
دوم) بجای Govahiha یک جدول Education برایتان اضافه کردم که فهرستی از تاریخ و مدارج تحصیلی هر Contact را نگهداری میکند.
یعنی خیلی شبیه Govahiha خودتان است، Education نگه میدارد که یک فرد چه زمانی دیپلم و کارشناسی و کارشناسی ارشد و... اخذ کرده

و دو تغییر کوچک دیگر ...
سوم) دکمه ذخیره تصویر را حذف کردم و کل ذخیره اطلاعات فیلدها و تصویر با هم در همان دکمه پایین انجام میشود.
چهارم) شی DbContext را بجای UserControl به یک سطح بالاتر و داخل Form منتقل کردم.

تغییراتی فرصت کردم انجام دهم، همین ها بوده، امیدوارم کافی باشد وبرای ادامه کار کمک تان کند.
جهت بروز رسانی دیتابیس از فرمان Update-Database استفاده کنید.
مانند قبل، برای کاهش حجم بسته EF6 حذف شده، کافیست در زمان Open پروژه اینترنت تان وصل باشد وکمی منتظر بمانید تا خود VS بسته فوق را ترمیم کند.
به ConnectionString دقت کنید و بسته به شرایط رایانه خودتان ، آن را ویرایش کنید.

EF6WindowsFormsSample2.zip
موفق باشید.
1398-10-16 10:10
booysusa

 
درود بر شما مهندس شریفی گرامی
سپاسگزارم بابت وقتی که میگذارید (متوجه ارزش راهنمایی و کارتان هستم )
همچنین میدانم چقدر مشغله دارید و این باعث میشود بیشتر شرمنده شما بشوم



برنامه را دانلود کردم، در واقع چیزی که من میخواهم خیلی شبیه به اون نبود، ولی از برخی روش ها که انجام داده بودید استفاده کردم و کارم پیش رفت ولی در بخش رابطه ها (گواهی ها - حساب ) هنوز مشکل دارم، اگر این دو مورد درست بشوند برنامه ام از این مرحله که متوقف شده است پیش میرود.

این برنامه که گذاشتید را اندکی ویرایش کردم و چیزهایی که مشکل دارم را در برنامه (در برنامه با لیبل منظورم را نوشتم ) نوشتم، تا شاید اینچنین بهتر بتوانم موارد درون ذهنم را به شما برسانم

نقل قول
با توجه به اینکه منظور شما از Govahiha نوعی از اطلاعات یک به یک با Contact است، هرچه با خودم تلاش کردم راضی نشدم رابطه آنها را یک به چند کنم!
آخر مگر یک Contact چند SerialKartMeli یا چند NoeKartMeli دارد؟

در واقع من دقیقا برنامه ام اینچنین هست که در لینک پائین آمده و برای همین اسرار دارم به این شکل پیش برود زیرا مخاطبم اینچنین میخواهد(هرچند نظر شما بسیار حرفه ای و تخصصی تر هست )


برای اصلاح این برنامه اصلا عجله نکنید لطفا، نمیخوام در روند کارتان با توجه به شلوغی و مشغله ذهنیتان خللی ایجاد کنم امیدوارم همیشه سرتان به کار و تفریح در کنار خانواده محترم گرم باشد

لینک دانلود

بی نهایت سپاسگزارم
1398-10-27 23:30
حاجی شریفی
مؤسس سایت
 
سلام
مشکل تقویم و تصویر پیوست و دکمه ویرایش که حل شده بود ...

تقویم ها گریدی باید از نوع DataGridViewIrDateColumn باشد
مجدد تمام تقویم هایتان را درست کردم

تفاوت ظاهری تقویم هم به دلیل تصویر استایل تقویم است.
تقویم طوری نوشته شده که با استایل و رنگ بندی دلخواه شما نشان داده شود.
برای همین دو تصویر پسضمینه و استایل میگیرد.
اگر دو تصویر را بدهید، ظاهر بهتری خواهد داشت.

دکمه مشاهده که فرمودید کار نمیکند در نسخه 12 روز قبل حل شده بود.
و دلیل کار نکردن در کد فعلی هم خارج شدن BindingSource از چرخه کار است
که مجدد درست شد.

الان دکمه Save داخل Govahiha را هم با دکمه Save کل پنجره Edit تان یکپارچه کردم.
و با زدن Save فرم ویرایش هم اطلاعات پایه و هم اطلاعات گواهی تان باهم ذخیره میشوند.

مورد نمایش "آقا/خانم" در گرید اولیه را هم برایتان انجام دادم
متاسفانه به موارد دیگر نرسیدم و فرصت نشد.
موفق باشید.

EF6WindowsFormsSample1.5.zip

1398-11-03 09:26
booysusa

 
درود مهندس شریفی
روزتون بخیر، سپاسگزارم بابت ارسال برنامه آن هم در زمانی که واقعا مشغله زیادی که دارید ولی بازهم به انجمن سر میزنید
نقل قول
تقویم ها گریدی باید از نوع DataGridViewIrDateColumn باشد
مجدد تمام تقویم هایتان را درست کردم

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

نقل قول
مورد نمایش "آقا/خانم" در گرید اولیه را هم برایتان انجام دادم

سپاسگزارم بله در همه گریدهام این کارو کردم

نقل قول
الان دکمه Save داخل Govahiha را هم با دکمه Save کل پنجره Edit تان یکپارچه کردم.
و با زدن Save فرم ویرایش هم اطلاعات پایه و هم اطلاعات گواهی تان باهم ذخیره میشوند.

بی نهایت سپاسگزارم، کلی در این قسمت مشکل داشتم، سپاس که روی کدها کامنت گذاشتید، مشکل خرابی تقویم رو هم کامنت کردید سپاس


فقط یه مشکل مهندس من قسمتی که توی فرم ویرایش گرید داره رو نمیدونم چطوری ثبت کنم؟
1398-11-11 23:19
حاجی شریفی
مؤسس سایت
 
سلام
نقل قول نوشته شده توسط: booysusa
... توی فرم ویرایش گرید داره رو نمیدونم چطوری ثبت کنم ...

در همان نمونه کد دوتا قبل که با مفهوم "مدرک تحصیلی" برایتان چیزی حاضر کرده بودم، کار با گرید موجود بود.
کافی است نام جدول "مدرک تحصیلی" را با جدول "حساب" تغییر دهید.
مجدد در همین نمونه کد آخر یک uclHesab2 برایتان درست کردم که (جهت سرعت بیشتر) فقط یک گرید برای حساب دارد که الان هم Load و هم Save اش کار میکند.
برای این کار یک فیلد جدید به جدول حساب اضافه کردم که باید دیتابیس تان را با فرمان Update-Database بروز کنید.

EF6WindowsFormsSample1.6.zip

و یک مطلب دیگر
نمیدانم برای چه هدفی این پروژه را انجام میدهید.
اگر هدف یک پروژه دانشگاهی جهت دریافت نمره و... است، پروژه در این حد بد نیست و میتوانید تمامش کنید.
شاید از سر دانشگاه های ما زیاد هم باشد

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

برای برنامه نویسی exe پیشنهاد میکنم دو سه کتاب برنامه نویسی WPF و Entity-Framework و SQL-Server تهیه کنید و قدم به قدم مطالعه کنید و مثال های کتاب را انجام دهید.
برخی از سایت ها در اینترنت آموزش های ویدیویی هم ارائه میدهند (میفروشند !) که شاید بد نباشد.
شخصا کتاب را ترجیح میدهم ولی برخی از افراد با آموزش ویدیویی راحت تر هستند.
البته در youtube هم بعضا آموزش های رایگان فارسی خواهید یافت.
( WPF تکنولوژی بسیار جدیدتری نسبت به WinForm است و اگر قرار است کتاب یا ویدیویی خریداری کنید ، بهتر است با محوریت این بستر جدید باشد )

ولی در هرصورت اگر منابعی برای آموزش نداشته باشید و تلاش کنید همه چیز را خودتان با آزمایش و خطا ، تجربه کردن یاد بگیرید ، به گمانم خیلی روش موثری نیست.
اتصال به چند منبع و مرجع گام به گام و مدون لازم است، آموزش یک بال تئوری دارد و یک بال عملی، نادیده گرفتن هر یک به فرآیند آموزش صدمه میزند.
موفق باشید.

1398-12-19 21:17
booysusa

 
درود و شب بخیر مهندس
پروژه دانشگاهی و در کنار یادگیری خودم هست

تو این مسیر شما بسیار کمکم کردید و فراموش نمی کنم