c# DataSource和BindingSource


今天花了一個下午的時間去研究一個積存的問題。為什么有時候DGV的DataSource綁定到集合,修改集合之后DGV沒有刷新,但是有時候又會刷新。今天碰到的情況是,通過Linq to SQL連接操作數據庫,前台通過一個DGV直接綁定和顯示數據,這樣前台的數據直接與數據庫連接,在窗口上執行的增刪改,最后通過一句db.SubminChanges()可以全部回寫到數據庫,很方便,編輯也比較直觀。

剛開始的時候,用dgv.DataSource = db.AAA來綁定數據。在窗口上執行增刪改,回寫,不存在任何問題。之后來了一個新的需求,從別的地方導入數據,通過后台代碼直接寫入綁定的數據。代碼如下:

Grid.DataSource = db.AAA_0228;//Load事件中

//以下代碼在添加事件中
AAA one = new AAA()
{
    Name = "Test",
    Age = 100,
    Flag = true,
    Qty = 123.06,
    Status = 1,
    Time = DateTime.Now,
};
var data = Grid.DataSource as Table<AAA>;
data.InsertOnSubmit(one);
Grid.Invalidate();

在Load事件中綁定數據源。在添加事件中,往數據源插入一條數據,最后刷新dgv。思路非常清晰,代碼也很少。調試,失敗了,界面沒有刷新。

通過斷點查看,發現data.InsertOnSubmit這句沒用,執行完之后,data沒有變化。

好,強行SubmitChanges,增加一行:data.Context.SubmitChanges();調試,還是失敗,這次data里面的數據ok了,但是界面還是刷不出來。

再斷點查看,發現data有一個cachedList,數據沒有刷新,還是舊數據。ok,強制刷新cachedList值,通過反射來賦值。

static void InternalSetNonPublicFieldValue(this object entity, string propertyName, object value)
{
    if (entity == null)
        throw new ArgumentNullException("entity");
    if (string.IsNullOrEmpty(propertyName))
        throw new ArgumentNullException("propertyName");

    var type = entity.GetType();
    var prop = type.GetField(propertyName, BindingFlags.NonPublic | BindingFlags.Instance);
    if (prop != null)
        prop.SetValue(entity, value);
    // add any exception code here if property was not found :)
}

調試,第n次失敗。data里面的數據也正確了,data的cachedList也正確了,data和dgv的DataSource也是指向一個地址的,但是就是還是,不成功

此問題最后通過BindingSource來解決,很慚愧的是,始終沒有去查問題究竟出在哪里。直接上代碼:

BindingSource bs = new BindingSource();//類變量

bs.DataSource = db.AAA_0228;//Load事件
Grid.DataSource = bs;

AAA_0228 one = new AAA_0228()//添加事件里面
{
    Name = "Test",
    Age = 100,
    Flag = true,
    Qty = 123.06,
    Status = 1,
    Time = DateTime.Now,
};

bs.Add(one);
bs.ResetBindings(false);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM