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);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值