[C#.NET][Winform][ADO.NET] DTO 與 DataGridView更新問題
這是我自己能力不足所遇到的一個問題,所幸小朱出面解惑,在此先謝謝他。
上篇寫道 [ADO.NET] 類別(Data Transfer Object )與資料繫結,用了類別來繫結資料,我很快的用這類別來將資料進行綁定。
先有個 Fields 類別屬性
public class Fields
{
public int ID { get; set; }
public int Number { get; set; }
public string Name { get; set; }
public string Phone { get; set; }
public string Address { get; set; }
}
在用戶端建立List,我想要有20資料
BindingList<Fields> CreateList()
{
BindingList<Fields> fieldList = new BindingList<Fields>();
for (int i = 0; i < 20; i++)
{
Fields f = new Fields();
f.ID = i + 1;
f.Number = this._Random.Next(1, 1000);
f.Name = "Name:" + this._Random.Next(1, 1000);
f.Phone = "Phone:" + this._Random.Next(1, 1000);
f.Address = "Address:" + this._Random.Next(1, 1000);
fieldList.Add(f);
}
return fieldList;
}
然後在進行DataGridView的DataBinding
this._Fields = this.CreateList();
this.dataGridView2.DataSource = this._Fields;
到目前為止都很正常跟上一篇沒什麼兩樣。
接下來我用Timer要讓 this._Fields 裡的資料變更
void _timerClass_Elapsed(object sender, System.Timers.ElapsedEventArgs e)
{
foreach (var f in this._Fields)
{
f.Number = this._Random.Next(1, 1000);
f.Name = "Name:" + this._Random.Next(1, 1000);
f.Phone = "Phone:" + this._Random.Next(1, 1000);
f.Address = "Address:" + this._Random.Next(1, 1000);
}
}
但問題來了,Timer所執行的程式有讓 this._Fields 裡的資料變更,但卻沒有通知DataGridView,導致DataGridView沒有更新,這就是我碰到的問題。
只要實作 INotifyPropertyChanged 就可以解決這個問題了 ,
public class Fields : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
protected void OnPropertyChanged(string name)
{
PropertyChangedEventHandler handler = PropertyChanged;
if (handler != null)
{
handler(this, new PropertyChangedEventArgs(name));
}
}
private int _ID = 0;
public int ID
{
get { return this._ID; }
set
{
this._ID = value;
OnPropertyChanged("ID");
}
}
…
}
只要觸發OnPropertyChanged即可,OnPropertyChanged("ID"); 中的"ID"指的是屬性的名字,每個屬性都設定過後就可以解決我的問題了;不過很奇妙的是,我不用屬性名稱,用值,只要挑一個會變更的屬性,也能更新UI
private int _Number = 0;
public int Number
{
get { return this._Number; }
set
{
this._Number = value;
OnPropertyChanged(this._Number.ToString());
}
}
後記:DV_Test.zip
最後用值來變更屬性的方法,若挑到了不會值變的屬性,UI還是不會更新的,所以保險的方法還是乖乖的一個一個設定才是正確的。
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET