[C#.NET][Winform][ADO.NET] DTO 與 DataGridView更新問題

  • 10529
  • 0
  • 2013-08-16

[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

Image result for microsoft+mvp+logo