我想创建一个从数据库中读取数据然后通过UI显示的应用程序。然后,用户可以添加/删除/更新字段并将其保存到DB,非常标准,对吧?
我有两张桌子:电机和措施。汽车表有很多领域,其中一个是"公司"。当然,同一家公司可以有几台电机,所以我想过滤这些公司,只在组合框中获得不同的电机。
我还在玩这种语言和VS,所以我做了一个简单的用户界面版本,用户可以添加一个新的电机,事实上,用户可以添加公司字段,因为我试图添加新公司并查看它是否在comboBox中自动更新。
为此,我使用实体框架和msdn的本教程进行数据绑定:
https://msdn.microsoft.com/en-us/data/jj682076.aspx
问题在于,当我添加新电机(使用新公司)时,如果我过滤掉不同的电机,它就不会更新,我的意思是,以下代码可以工作,自动更新所有公司的comboBox:
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}");
}
}
通过第一次实现,comboBox会更新并显示每个公司(针对每个电机):
按添加按钮 - > "列表已更改!"弹出窗口 - > "新电机:id"弹出
使用过滤器:
按添加按钮 - > "新电机:id"弹出
实际上电机增加了,但在重新启动程序之前它不会显示。
任何想法都会非常感激。我希望我能很好地解释自己。
答案 0 :(得分:2)
第二个示例中的以下行打破了绑定:
_context.Motors.Local.ToBindingList().Select(x => x.company).Distinct();
原因是.Select(x => x.company).Distinct()
的结果不是BindingList<Motor>
,而是简单的IEnumerable<string>
使用以下替代品:
var _companies = _context.Motors.Select(x => x.company).Distinct().ToList();
this.companyBindingSource.DataSource = _companies;
答案 1 :(得分:0)
这一行
this.companyBindingSource.DataSource = _context.Motors.Local.ToBindingList().Select(x => x.company).Distinct();
返回IEnumerable<T>
。在您的情况下,您希望它是列表,因此添加.ToList();
this.companyBindingSource.DataSource = _context.Motors.Local.ToBindingList().Select(x => x.company).Distinct().ToList();