如何从列表框中删除项目并将更改反映在实体中

How to remove item from listbox and have changes reflected in entity

我正在尝试将实体绑定到列表框,当我从实体中删除某些内容时,我希望它反映在列表框中。

这是一个代码片段:

SportsClubEntities spe = new SportsClubEntities

BindingSource bs = new BindingSource();


var stm = 
    from xyz in spe.SomeEntity where xyz.prop == 66
    select new { Name = xyz.name, rec = xyz }

bs.DataSource = stm.ToList();

ListBox.DataSource = bs;
ListBox.DisplayMember = "Name";
ListBox.ValueMember = "rec";

我有一个按钮,当我单击它时,我希望它删除列表框中的选定项目,但不仅如此,我还希望它从基础实体中删除该项目。即:当从列表框中选择并删除 xyz 时,我希望从 spe 中删除 xyz。

如果我执行 bs.Remove(item) 从列表框中删除项目(当我随后调用 bs.ResetBindings(),但它不会更新实体 (spe.SomeEntity)。最初,我以为会,但后来我意识到 LINQ 是一个查询,返回一些结果。

当我单击删除按钮时,我可以执行 spe.SomeEntity.Remove(item),但列表框不会更新。

有没有一种方法可以只对其中一个执行删除,并更新两个?

我这样做完全错了吗?有某种 'standard' 方法可以做这种事吗?

我无法将 spe.SomeEntity.ToList() 直接绑定到列表框,因为我需要实体中记录的子集。

感谢任何帮助,我还在学习。

你可以这样做:

    private void Form1_Load(object sender, EventArgs e)
    {
        list1 = new List<Person>();

        using (SportsClubEntities spe = new SportsClubEntities())
        {
            list1 = (from p in spe.People
                      select p).ToList();
        }

        bs = new BindingSource();
        bs.DataSource = list1;

        listBox1.DataSource = bs;
        listBox1.DisplayMember = "FirstName";
    }

    private void button1_Click(object sender, EventArgs e)
    {
        Person p1 = (Person)listBox1.SelectedItem;
        list1.Remove((Person)listBox1.SelectedItem);
        bs.ResetBindings(false);

        using (SportsClubEntities spe = new SportsClubEntities())
        {
            Person p2 = (from p in spe.People
                     where p.BusinessEntityID == p1.BusinessEntityID
                     select p).FirstOrDefault();

            spe.People.Remove(p2);
            spe.SaveChanges();
        }
    }

删除名为 "Jossef" 的人: