【发布时间】:2016-04-19 11:12:14
【问题描述】:
我想创建一个从数据库读取数据然后通过 UI 显示的应用程序。然后用户可以添加/删除/更新字段并将其保存到数据库中,非常标准,对吧?
我有两张表:Motors 和Measures。 Motors 表有很多字段,其中之一是“公司”。当然,同一家公司可以有多个电机,所以我想过滤这些公司并在组合框中只获取不同的公司。
我还在玩语言和 VS,所以我做了一个简单的 UI 版本,用户可以在其中添加新电机,实际上,用户可以添加公司字段,因为我是尝试添加新公司并查看它是否在组合框中自动更新。
为此,我使用 Entity Framework 和来自 msdn 的本教程进行数据绑定:
https://msdn.microsoft.com/en-us/data/jj682076.aspx
问题是,当我添加一个新电机(与一家新公司)时,如果我过滤不同的电机,它不会更新,我的意思是,以下代码 确实 工作并自动更新包含所有公司的组合框:
private void MainForm_Load(object sender, EventArgs e)
{
_context = new MotorsContext();
_context.Motors.Load();
this.companyBindingSource.DataSource = _context.companies.ToBindingList();
companyBindingSource.ListChanged += CompanyBindingSource_ListChanged;
}
而以下不是:
private void MainForm_Load(object sender, EventArgs e)
{
_context = new MotorsContext();
_context.Motors.Load();
this.companyBindingSource.DataSource = _context.Motors.Local.ToBindingList().Select(x => x.company).Distinct();
companyBindingSource.ListChanged += CompanyBindingSource_ListChanged;
}
我创建了一个 ListChanged 方法来查看软件何时检测到列表确实发生了变化。在第一个代码中它确实触发了,但在第二个代码中没有。当我添加过滤器时,观察者可能没有检测到列表中的变化?
private void CompanyBindingSource_ListChanged(object sender, ListChangedEventArgs e)
{
MessageBox.Show("List changed!");
}
最后,添加电机按钮:
private void button1_Click_1(object sender, EventArgs e)
{
if (!string.IsNullOrWhiteSpace(textBox1.Text))
{
Motor m = new Motor();
m.company = textBox1.Text;
_context.Motors.Add(m);
_context.SaveChanges();
MessageBox.Show($"New motor, id: {m.motorID}");
}
}
第一次实现时,组合框会更新并显示每个公司(每个电机):
按下添加按钮 -> “列表已更改!”弹出窗口->“新电机:id”弹出窗口
使用过滤器:
按下添加按钮 -> “新电机:id”弹出窗口
其实电机加了,但是重启程序才显示。
任何想法将不胜感激。我希望我已经很好地解释了自己。
【问题讨论】:
标签: c# entity-framework data-binding