【问题标题】:DataSource not updating, only with LINQ数据源不更新,仅使用 LINQ
【发布时间】:2016-08-18 16:55:20
【问题描述】:

我正在使用一个 LINQ To SQL 类,它在构造函数之前被初始化(表被添加到它,它可以工作):

DataClasses1DataContext dc = new DataClasses1DataContext();

然后我有一个列表框:

listBox1.DataSource = dc.MyTable;
listBox1.DisplayMember = "Name";
listBox1.ValueMember = "PersonID";

那我要添加一条新记录:

MyTable mt = new MyTable();
mt.Name = "John Smith";
mt.PersonID = 30;
dc.MyTable.InsertOnSubmit(mt);
dc.SubmitChanges();

我想刷新列表框的数据源,方法是:

listBox1.DataSource = dc.MyTable;

...但是新记录没有出现。 但是,如果我像这样更新数据源:

var q = from x in dc.MyTable select x;
listBox1.DataSource = q;

这行得通。

我唯一的问题是:为什么?我看到有些人将 DataSource 设置为 null,然后返回 table,但这并没有解决我的问题。

(这是一个winforms项目)


listBox1.DataSource = dc.MyTable.ToList() 似乎解决了这个问题,由 cmets 中的 Ehsan Sajjad 回答。

【问题讨论】:

  • 添加了一个编辑,它是一个 Winforms 项目
  • 你试过了吗:listBox1.DataSource = dc.MyTable.ToList()
  • 谢谢你,Ehsan,它有效!

标签: c# winforms


【解决方案1】:

当您通过分配完全相同的对象来更新您的数据源时,控件将永远不会知道发生了什么变化。如果您不想实现 MVVM、MVC 或类似的东西,您可以清除该值:

listBox1.DataSource = null;
listBox1.DataSource = dc.MyTable;

【讨论】:

    【解决方案2】:

    ToList() 可能在拥有大量项目时导致性能 (https://stackoverflow.com/a/15027581/4550393) 问题。由于在这种情况下您并不真正需要ToList(),因此更好的解决方案是清除列表并在之后重新绑定:

    listBox1.Items.Clear();
    listBox1.DataSource = dc.MyTable;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-10-05
      • 1970-01-01
      • 2011-05-30
      • 1970-01-01
      • 1970-01-01
      • 2019-12-01
      相关资源
      最近更新 更多