بروزرسانی اطلاعات در DataGridView بدون کویری مجدد
در یک پروژه سی شارپ WPF با دیتابیس SQL Server و Entity Framwork
میخواهیم زمانی که اطلاعات درج حذف یا بروزرسانی شد دیتا گرید رو بروز کنیم و اطلاعات رو ببینیم
دوتا مشکل وجود داره :
1- باید یک کویری SELECT یا ItemSource مجددا بزنیم و داخل دیتا گرید بریزیم که اطلاعات بروز باشه , که اگر اطلاعات زیاد باشه کند عمل میکنه
var query = dbms.Database.SqlQuery<MYTABLE>("SELECT CODE,NAME,TEL FROM MYTABLE").ToList();
DataGrid1.ItemSource = query ;
/////یا
DataGrid1.ItemSource = null;
DataGrid1.ItemSource = dbms.MYTABLE.ToList();
2- فرض کنید بین 10 هزار رکورد توی دیتا گرید که لیست شده میخوایم ردیف شماره 756 , اطلاعاتش رو اصلاح (UPDATE) کنیم و بعد از اون بخوایم دیتاگرید بروز(در نمایش اطلاعات) بشه , باید مجددا اطلاعات رو
از دیتابیس بگیریم و بریزیم داخل دیتا گرید , که اون ردیفی که در حال اصلاح کردنش بودیم جابه جا میشه (چون از اول لود میشه ردیفش رو گم میکنیم و دوباره باید پیداش کنیم).
چیز هایی مثل MyDataGrid.Refresh() هم کار نمیکنه
چکاری میتونیم انجام بدیم که اطلاعات رو در داخل دیتاگرید بعد از عملیات (INSERT ,UPDATE,DELETE)با سرعت بالا بروز کنیم (نمایشش در دیتا گرید )
بدون اینکه ردیفی که روش فوکوس کرده بودیم جابه جا بشه (یا در Reload اون رکوردی که روش بودیم بهم نخوره
لطفا راهنمایی بفرمایید.
باتشکر
پاسخ هوش مصنوعی
برای بروزرسانی اطلاعات در DataGridView بدون انجام یک کویری مجدد، می توانید از روش زیر استفاده کنید:
به جای بارگذاری مجدد تمامی داده ها، می توانید تنها رکورد خاصی را که می خواهید بروزرسانی کنید، ویرایش کنید و سپس آن را در DataGrid به روز کنید. به این ترتیب، می توانید با حداقل تغییرات فقط رکوردی را که نیاز به بروزرسانی دارد تغییر دهید.
در اینجا یک مثال آورده شده است:
private void UpdateRow(int id, string newName, string newTel)
{
// پیدا کردن رکوردی که باید به روز شود
var rowToUpdate = dbms.MYTABLE.Find(id);
if (rowToUpdate != null)
{
rowToUpdate.NAME = newName;
rowToUpdate.TEL = newTel;
// ذخیره تغییرات در دیتابیس
dbms.SaveChanges();
// به روز رسانی رکورد در DataGrid بدون بارگزاری مجدد
var dataGridItem = DataGrid1.ItemsSource.Cast().FirstOrDefault(x => x.CODE == id);
if (dataGridItem != null)
{
dataGridItem.NAME = newName;
dataGridItem.TEL = newTel;
}
// اطمینان حاصل کردن از اینکه DataGrid به روز شده است
DataGrid1.Items.Refresh();
}
}
در این کد:
- ابتدا رکورد مورد نظر را با استفاده از
Find
پیدا می کنید. - سپس ویژگی های رکورد را به روز می کنید و تغییرات را در دیتابیس ذخیره می کنید.
- بعد از آن، رکورد به روز شده را در DataGrid بدون بارگذاری مجدد پیدا کرده و اطلاعات آن را نیز به روز می کنید.
- در نهایت با فراخوانی
DataGrid1.Items.Refresh()
، تغییرات در DataGrid نمایش داده می شوند.
با این رویکرد، می توانید فقط رکوردهای مورد نیاز را به روز کرده و از جابه جایی ردیف ها جلوگیری کنید.
شما نمیتونید اطلاعات رو داخل DataGridView ذخیره کنید و برای رفرش اطلاعات باید حتما یک بار مجدد اطلاعات رو از دیتابیس فراخوانی کنید. ولی معمولا نیازی نیست شما همه اطلاعات رو از دیتابیس واکشی کنید.
مطمئنا اگر شما 10 هزار یا 100 هزار رکورد داخل دیتابیس خودتون داشته باشید واکشی و نمایش این حجم از اطلاعات قدری باعث کند شدن برنامه شما میشه.
من خودم معمولا بیشتر از 1000 تا رکورد رو واکشی نمیکنم. و اگر کاربر نیاز به اطلاعاتی داشت میتونه با استفاده از قابلیت جستجو که قرار میدم اطلاعات مورد نیازش رو پیدا کنه.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- حذف کامل یک رکورد در جدول ریلیشن شده
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- مقایسه ساختار دو دیتابیس در Sql Server
- اشکال در ایجاد کلید خارجی در Sql Server
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf