سلام.
یک برنامه WinForm دارم که در آن از الگوی Unit Of Work استفاده کردم.این برنامه شامل یک فرم است در آن یک دیتا گرید وظیفه نمایش اطلاعات بانک دانش آموزان را بر عهده دارد.
مدل:
public class Student
{
[Key, DatabaseGenerated(DatabaseGeneratedOption.None)]
public int stdId { get; set; }
[MaxLength(40)]
[Required]
public string StudentName { get; set; }
}
افزودن و ویرایش در یک فرم دیگر انجام می شود اما حذف در همان فرمی که جدول اطاعات دانش اموزان هست انجام میشود.
برنامه در زمان حذف و افزودن رکورد جدید به درستی کار میکند و جدول نمایش اطلاعات پس انجام هر کدام از این دو عملیات با موفقیت بروز شده و تغییرات قابل مشاهده می باشد
مشکل:
در زمان ویرایش اطلاعات با آنکه عملیات با موفقیت انجام میشود و جدول پس از عملیات ویرایش مجدداً به روز رسانی میشود اما تغییرات در جدول به روز نمی شود.اما اگر فرم نمایش اطلاعات بسته شده و مجددا باز شود اطلاعات تغییر یافته این بار مشاهده میشود.
بار گزاری جدول:
public void LoadDataGrid()
{
var list = _iuw.StudentRepositoryUW.Get().ToList();
dataGridView1.DataSource = list;
}
که در آن _iuw به صورت تزریق وابستگی در کانستراکتور برنامه تزریق شده است
private IUOW _iuw;
public frmListStudent(IUOW iuw)
{
InitializeComponent();
_iuw = iuw;
}
ویرایش رکورد در منوی راست کلیک جدول ایجاد شده که با انتخاب ان فرم ویرایش باز می شود و اطلاعات انتخاب شده به این فرم انتقال می یابد.
چون از الگوی unit of work که به صورت تزریق در کانستراکتور فرم ها استفاده شده، در متد Show فرم ها از StructureMap.Container استفاده کردم.
private void btnEdit_Click(object sender, EventArgs e)
{
variable.id = int.Parse(dataGridView1.CurrentRow.Cells[0].Value.ToString());
OpenForm();
LoadDataGrid();
}
private void OpenForm()
{
var container = new StructureMap.Container(new Model.IOC.TypeRegistry());
var frm = container.GetInstance<frmNewEditeStudent>();
frm.ShowDialog();
}
دستورات پر کردن فرم جدید جهت ویرایش :
public partial class frmNewEditeStudent : Form
{
int id;
private IUOW _iuw;
public frmNewEditeStudent(IUOW iuw)
{
InitializeComponent();
_iuw = iuw;
}
private void Form1_Load(object sender, EventArgs e)
{
id = variable.id;
if (id>0)
{
FillEdit();
btnSave.Enabled = false;
btnEditSave.Visible = true;
}
else
{
btnEditSave.Visible = false;
}
private void FillEdit()
{
var model = _iuw.StudentRepositoryUW.Get(x => x.stdId == id).FirstOrDefault();
txtStdId.Text = model.stdId.ToString();
txtStdId.Enabled = false;
btnSave.Enabled = false;
txtStudentName.Text = model.StudentName;
btnEditSave.Visible = true;
}
}
دستورات ثبت ویرایش :
private void btnEditSave_Click(object sender, EventArgs e)
{
var model = _iuw.StudentRepositoryUW.Get(x => x.stdId == id).FirstOrDefault();
model.StudentName = txtStudentName.Text;
_iuw.StudentRepositoryUW.Update(model);
_iuw.save();
variable.id=0;
this.Close();
}
همانطور که می بینید بعد از عمل ویرایش ، فرمویرایش بسته شده و تابع LoadDataGrid(); اجرا شده که باید جدول به روز رسانی شود اما این عمل به درستی کار نمی کند اما با بستن فرمی که جدول در آن قرار دارد و باز کردن مجدد آن اطلاعات به روز رسانی و تغییرات قابل مشاهده است.
سوالتون سوال خوبی هست. به همین خاطر پاسخ سوال رو به شما میدم تا سایر کاربرانی که نیاز هم دارن استفاده کنن.
شما قبلا این سوال رو در لینک زیر مطرح کردید و گفتم که باید برای نمایش کپی جدید از اطلاعات بعد از ویرایش یکبار دیتابیس رو new کنید یا نمونه سازی کنید.
به روزنشدن اطلاعات DataGrid بعد از ویرایش در dotnet Core
خب وقتی شما از الگوی UnitOfWork استفاده می کنید به طور مستقیم به دیتابیس دسترسی ندارید و نمی تونید دیتابیس رو نمونه سازی کنید. خب در این موارد می تونید از متدهای خود Entity Framework استفاده کنید و اطلاعات رو ReLoad کنید.
افزودن متد Refresh در کلاس Unit Of Work
ابتدا متدی به نام Refresh در کلاس UnitOfWork اضافه کنید:
public void Refresh(object T)
{
_context.Entry(T).Reload();
}
همونطور که میبینید این متد یک ورودی از نوع object داره که این ورودی همون رکورد یا ردیفی هست که اطلاعاتش ویرایش شده. (خب این متد رو داخل اینترفیس هم تعریف کنید.)
حالا به راحتی می تونیم از این متد در فرم استفاده کنیم.
public void LoadDataGrid(int id = 0)
{
if (id == 0)
{
var list = _iuw.StudentRepositoryUW.Get().ToList();
dataGridView1.DataSource = list;
}
else
{
_iuw.newRefresh(_iuw.StudentRepositoryUW.GetById(id));
var list = _iuw.StudentRepositoryUW.Get().ToList();
dataGridView1.DataSource = list;
}
}
متد LoadDataGrid رو به صورت بالا تغییر دادیم. یک پارامتر ورودی به نام id با مقدار پیش فرض 0 هم قرار دادیم. اگر مقدار پارامتر 0 باشه که هیچی اطلاعات عادی نشون داده میشه. اما اگر مقدار id بزرگتر است 0 باشه یعنی این متد برای ویرایش صدا زده شده و اون رکورد رو رفرش شده نمایش میدیم.
متد BtnEdit_Click
private void btnEdit_Click(object sender, EventArgs e)
{
int getId = int.Parse(dataGridView1.CurrentRow.Cells[0].Value.ToString());
variable.id = getId;
OpenForm();
LoadDataGrid(getId);
}
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1161
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
599
- پاسخ :
1
|
تاریخ :
1403/07/13
- ساعت :
12:06:00 PM
- بازدید :
350
- پاسخ :
1
|
تاریخ :
1403/06/24
- ساعت :
08:52:00 PM
- بازدید :
319
- پاسخ :
1
|
تاریخ :
1398/09/14
- ساعت :
01:58:00 PM
- بازدید :
4270
- پاسخ :
1
|
تاریخ :
1403/05/16
- ساعت :
05:43:00 AM
- بازدید :
662
- پاسخ :
0
|
تاریخ :
1398/09/05
- ساعت :
06:04:00 PM
- بازدید :
3173
- پاسخ :
2
|
تاریخ :
1398/09/08
- ساعت :
11:38:00 PM
- بازدید :
3251
- پاسخ :
1
|
تاریخ :
1403/04/12
- ساعت :
07:27:00 PM
- بازدید :
658
- پاسخ :
0
|
تاریخ :
1403/01/29
- ساعت :
08:08:00 AM
- بازدید :
688
- پاسخ :
4
|
تاریخ :
1401/02/24
- ساعت :
02:17:00 PM
- بازدید :
2013
- پاسخ :
1
|
تاریخ :
1403/08/29
- ساعت :
07:15:00 PM
- بازدید :
78
- پاسخ :
0
|
تاریخ :
1403/08/18
- ساعت :
10:40:00 AM
- بازدید :
109
- پاسخ :
0
|
تاریخ :
1402/07/23
- ساعت :
04:01:00 PM
- بازدید :
1034
- پاسخ :
1
|
تاریخ :
1403/05/30
- ساعت :
09:22:00 AM
- بازدید :
430
- پاسخ :
1
|
تاریخ :
1402/08/01
- ساعت :
06:25:00 PM
- بازدید :
931
- پاسخ :
1
|
تاریخ :
1402/08/16
- ساعت :
10:38:00 AM
- بازدید :
1356
- پاسخ :
1
|
تاریخ :
1398/08/17
- ساعت :
01:27:00 AM
- بازدید :
4800
- پاسخ :
1
|
تاریخ :
1402/09/08
- ساعت :
07:34:00 PM
- بازدید :
1161
- پاسخ :
1
|
تاریخ :
1402/09/21
- ساعت :
11:10:00 PM
- بازدید :
599
- پاسخ :
1
|