دسته بندی ها
10:07 1398/10/11

رفرش یک ردیف در دیتاگرید wpf بعد از به روزرسانی در دیتابیس

مشخصات سوال کننده :
کاربر : Parsa_Hassani     امتیاز کاربر : 18     رتبه کاربر : 40
دسته بندی : WPF

به این سوال امتیاز بدهید    0
تعداد بازدید این سوال : 2977
هوش مصنوعی

پاسخ هوش مصنوعی

برای به روزرسانی فقط یک ردیف خاص در DataGrid بعد از اینکه آن را در دیتابیس به روزرسانی کردید، می توانید از روش های زیر استفاده کنید:

فرض کنید شما یک لیست از اشیاء دارید که به عنوان منبع داده DataGrid استفاده می شود. هنگامی که یک ردیف را به روزرسانی می کنید، باید فقط آن ردیف را در منبع داده شناسایی و به روزرسانی کنید.

در اینجا یک نمونه کد برای به روزرسانی یک ردیف خاص در DataGrid آورده شده است:


// فرض کنید MyDataList یک ObservableCollection از داده هاست
private void UpdateRowInDataGrid(MyDataType updatedRow)
{
    // فرض کنید id خاصی را برای شناسایی ردیف دارید
    var existingRow = MyDataList.FirstOrDefault(x => x.Id == updatedRow.Id);
    
    if (existingRow != null)
    {
        // مقادیر ردیف موجود را با مقادیر ردیف به روزرسانی شده تعویض کنید
        existingRow.Property1 = updatedRow.Property1;
        existingRow.Property2 = updatedRow.Property2;
        // و به همین ترتیب برای دیگر خصوصیات
    }
    
    // Notify the view that the specific item has been updated (در صورت نیاز)
    // با توجه به این که ObservableCollection قابلیت اطلاع رسانی را دارد، 
    // نیاز به این کار نیست اما برای بعضی از نوع ها مانند List باید این کار را انجام دهید.
}

شما می توانید از مکانیزم های Binding WPF استفاده کنید تا به روزرسانی ها به طور خودکار در DataGrid نمایش داده شوند. برای این کار اطمینان حاصل کنید که کلاس های شما از INotifyPropertyChanged پیروی می کنند.

با این کار، پس از به روزرسانی ردیف خاص، DataGrid به طور خودکار تغییرات مربوط به آن ردیف را نمایش می دهد و نیازی به رفرش کل DataGrid نخواهید داشت.

به این پاسخ امتیاز بدهید    0
امتیاز: - رتبه: -
پاسخ دهنده : fateme 18:35 1398/10/11

فکر نمیکنم این کار قابل انجام باشه در DataGrid در WPF

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

 

dataGrid1.ItemsSource = query;

 

یعنی وقتی میخواید اطلاعات رو توی دیتاگرید در WPF نمایش بدید کل اطلاعات واکشی شده از سمت دیتابیس رو مستقیم می ریزید توی ItemSource. پس دیتاگرید مجددا از اول اطلاعاتش پر میشه.

 

راه حل: اگر تعداد رکوردهای شما زیاده و باعث کند شدن برنامه میشه بهتره با استفاده از دستور Top در sql  مثلا 100 رکورد یا نهایتا 500 رکورد رو واکشی کنید. و با استفاده از جستجو به کاربر امکان این رو بدید که توی سایر رکورد ها هم جستجو کنه.

به این پاسخ امتیاز بدهید    0
امتیاز: 1635 رتبه: 2
پاسخ دهنده : Sowgandi 10:45 1398/10/12

سلام. دوست عزیز شما از یه روش میتونی استفاده کنی که بعد از اینکه گزینه ای رو توی دیتاگرید در دیتابیس تغییر دادی بعدش بیای همون گزینه رو توی دیتاسورس دیتاگرید هم تغییر بدی. مثلا شما یه جدولی با نام Persons در دیتابیس با سه ستون PersonID , PersonName , PersonFamily دارید حالا پس از تغییر در جدول بجای اینکه دوباره دیتاگرید رو رفرش کنید و از اول مقدار بدید یه سلکت از همون ردیفی که آپدیت کردید در دیتابیس بزنید و مقدار اون رو داخل یک کوئری بریزید و بعد تک تک ستون های دیتاسورس رو با استفاده از این کوئری آپدیت کنید.

 var ID = (MyDataGrid.SelectedItem as Persons).PersonID;

var Quary = (from x in Db.Persons where x.PersonID == ID select x).SingleOrDefault();

var SelectedItem = (MyDataGrid.SelectedItem as Persons);

SelectedItem.PersonName = Quary.PersonName;
SelectedItem.PersonFamily = Quary.PersonFamily;

MyDataGrid.Items.Refresh();

 

به این پاسخ امتیاز بدهید    0
امتیاز: 876 رتبه: 3
پاسخ دهنده : Parsa_Hassani 17:03 1398/10/12

دوستان ممنون بابت راهنمایی.

 دوست گرامی Sowgandi کدی که نوشتید رو استفاده کردم  یه مشکلی داره اونم اینکه بعد از اجرای کد دیتاگرید پرش میکنه به ردیف اول! البته بدون اینکه دوباره تابع لود دیتاگرید رو فراخوانی کنم دیتاگرید رفرش شد ولی چجوری میشه کاری کرد که دیتاگرید بعد از رفرش ثابت بمونه و پرش نکنه؟!

به این پاسخ امتیاز بدهید    0
امتیاز: 18 رتبه: 40
پاسخ دهنده : Sowgandi 20:09 1398/10/12

برای رفع این مشکل باید از کد زیر استفاده کنید.

 var ID = (MyDataGrid.SelectedItem as Persons).PersonID;

var Quary = (from x in Db.Persons where x.PersonID == ID select x).SingleOrDefault();

 (MyDataGrid.SelectedCells[1].Column.GetCellContent(item) as TextBlock).Text = Quary.PersonName;
 (MyDataGrid.SelectedCells[2].Column.GetCellContent(item) as TextBlock).Text = Quary.PersonFamily;

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

 var ID = (MyDataGrid.SelectedItem as Persons).PersonID;

var Quary = (from x in Db.Persons where x.PersonID == ID select x).SingleOrDefault();

var SelectedItem = (MyDataGrid.SelectedItem as Persons);

SelectedItem.PersonName = Quary.PersonName;
SelectedItem.PersonFamily = Quary.PersonFamily;

 (MyDataGrid.SelectedCells[1].Column.GetCellContent(item) as TextBlock).Text = Quary.PersonName;
 (MyDataGrid.SelectedCells[2].Column.GetCellContent(item) as TextBlock).Text = Quary.PersonFamily;

موفق باشید.

به این پاسخ امتیاز بدهید    3
امتیاز: 876 رتبه: 3
برای ارسال پاسخ لطفا وارد حساب کاربری خود شوید.   ورود