View Full Version : سوال: رفرش نشدن DATAGRID بعد از UPDATE
r4hgozar
دوشنبه 20 مهر 1394, 10:36 صبح
سلام.
من دیتاگرید رو بعد از UPDAte کرد ، itemsource اون رو تغییر می دم تا رفرش بشه اما متاسفانه رفرش نمیشه.
در ایجاد کردن و حذف کردن از همین روش استفاده می کنم کار می کنه اما در update کار نمی کنه.
datagrid.items.refresh() رو هم استفاده کردم اما باز هم درست نشد.
elec60
دوشنبه 20 مهر 1394, 20:01 عصر
اين كاري كه شما انجام ميدين صحيح نيست
نبايد ItemsSource رو هر دفعه ست كنين! اينجوري كل رديف هاي ديتاگريد هر دفعه رندر ميشن و اگه تعداد بالا باشه پرفورمنس مياد پايين.
class اي كه ساختي بايد INotifyPropertyChanged رو پياده سازي كنه و براي Property هايي كه آپديت ميشن بايد هنگام تغيير، ايونت PropertyChanged فاير بشه.
r4hgozar
سه شنبه 21 مهر 1394, 05:27 صبح
ممنون. اگه امکان داره نمونه کد بدین ممنون میشم.
سیدسبحان
شنبه 25 مهر 1394, 15:57 عصر
منم همین مشکل رو دارم
تازه هم با این mvvm آشنا شدم. هیچی ازش نمیفهمم.
میشه نمونه کد بزارید؟
elec60
جمعه 01 آبان 1394, 08:51 صبح
منم همین مشکل رو دارم
تازه هم با این mvvm آشنا شدم. هیچی ازش نمیفهمم.
میشه نمونه کد بزارید؟
http://danrigby.com/2012/01/08/inotifypropertychanged-the-anders-hejlsberg-way/
r4hgozar
دوشنبه 04 آبان 1394, 10:49 صبح
http://danrigby.com/2012/01/08/inotifypropertychanged-the-anders-hejlsberg-way/
ممنون از شما
Mori Bone
دوشنبه 11 آبان 1394, 18:40 عصر
اين كاري كه شما انجام ميدين صحيح نيست
نبايد ItemsSource رو هر دفعه ست كنين! اينجوري كل رديف هاي ديتاگريد هر دفعه رندر ميشن و اگه تعداد بالا باشه پرفورمنس مياد پايين.
class اي كه ساختي بايد INotifyPropertyChanged رو پياده سازي كنه و براي Property هايي كه آپديت ميشن بايد هنگام تغيير، ايونت PropertyChanged فاير بشه.
سلام. ممنون میشم نمونه کدی قرار بدید
elec60
یک شنبه 17 آبان 1394, 19:11 عصر
سلام. ممنون میشم نمونه کدی قرار بدید
فرض کنيد کلاس Person رو داريم که خاصيت های Id و Name داره و يه ليست از نمونه های Person ساختيم و ItemsSource یه DataGrid رو برابر اين ليست قرار داديم. در اين صورت Datagrid رکوردهای موجود رو نمايش ميده. اما اگه مثلا Name يکی از اين Person ها رو تغيير بديم DataGrid اين تغيير رو متوجه نميشه و نمايش نميده(مقدار قبلی رو نمايش ميده) که طبيعی هم هست. چون DataGrid بدبخت از کجا ميخواد بفهمه که ويرايشی صورت گرفته(نميتونه که دايم چک کنه ببينه ويرايش داريم يا نه!) اما اگه خود Person ای که ويرايش ميشه به DataGrid خبر یده که من ويرايش شدم DataGrid هم تغييرات رو دريافت ميکنه و تو نمايش لحاظ ميکنه. برای اينکه کلاس Person اين قابليت رو داشته باشه که وقتی ويرايش شد خبر بده بايد interface ای به اسم INotifyPropertyChanged رو پياده سازی کنه و داريم:
class Person : INotifyPropertyChanged{
public event PropertyChangedEventHandler PropertyChanged;
public int Id { get; set; }
private string _name;
public string Name
{
get
{
return _name;
}
set
{
if (value != _name)
{
var PC = PropertyChanged;
if (PC != null)
PC(this, new PropertyChangedEventArgs(nameof(Name)));
}
}
}
}
elec60
یک شنبه 17 آبان 1394, 19:29 عصر
تو قسمت set مربوط به خاصيت Name از کلمه کليدی nameof استفاده کرديم که تو C#6.0 معرفی شده. اين کلمه کليدی اسم خاصيت Name رو بر میگردونه!
بجای PC(this, new PropertyChangedEventArgs(nameof(Name)));
میشه از PC(this, new PropertyChangedEventArgs(nameof("Name")));
هم استفاده کرد. اما بهتره از عملگر nameof استفاده کنيم چون ممکنه اسم رو به صورت استرينگ اشتباه بنويسيم و دليل محکمتر اينکه اگه در آينده بخواييم refactoring انجام بديم با nameof کارمون خيلی ساده تر ميشه و نيازی نيست که اسم رو به صورت استرينگی، دستی تغيير بديم. کلا با رشته ها امکان ديباگ در زمان کامپايل رو از دست ميديم.
البته از Attribute ای به اسم [CallerMemberName] هم که تو C#5.0 معرفی شده ميشه استفاده کرد اما اين صفت و يا Attribute در runtime اسم فيلد رو برمی گردونه ولی nameof در compile time
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.