我想创建一个从数据库读取数据然后通过 UI 显示的应用程序。然后用户可以添加/删除/更新字段并将其保存到数据库中,非常标准,对吗?

我有两个表:Motors 和 Measures。 Motors 表有很多字段,其中之一是“公司”。当然,同一家公司可能有多个电机,因此我想过滤这些公司,并在组合框中仅获取不同的电机。

我还在玩语言和VS,所以我做了一个简单版本的用户界面,用户可以在其中添加新的电机,实际上用户可以添加公司字段,因为我正在尝试添加一个新公司,看看它是否在组合框中自动更新。

为此,我使用 Entity Framework 和来自 msdn 的本教程进行数据绑定(bind):

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}");
    }
}

在第一个实现中,comboBox 会更新并显示每个公司(对于每个电机):

按添加按钮->“列表已更改!”弹出窗口->“新电机:id”弹出窗口

使用过滤器:

按添加按钮 - >“新电机:id”弹出窗口

实际上电机增加了,但直到程序重新启动才显示。

任何想法将不胜感激。我希望我已经很好地解释了自己。

最佳答案

第二个示例中的以下行打破了绑定(bind):

_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;

关于c# - DataBinding() 不适用于 Distinct()( Entity Framework ),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36716698/

10-12 00:26
查看更多