如何将列表框的选定项目与数据库中的项目进行比较,并删除未选中的项目

时间:2015-02-26 14:36:32

标签: c# linq-to-sql listbox

我在使代码工作时遇到了一些麻烦。我正在使用LINQ to SQL从我的数据库中检索所有我的actor对象,这些对象是某个电影的演员。我检查了输出,他们很好。

因为我必须使用字典来显示演员姓名作为一个整体,我需要比较列表框的选定值是否与演员的First-和LastName的组合相同。

我要做的第一件事就是浏览列表框中的所有选定项目。接下来,我想将它们与使用LINQ检索的actorsm的First和LastName进行比较。但它并不像我想要的那样有效。

示例:电影是低俗小说,与电影有关的演员是乌玛瑟曼,塞缪尔杰克逊和约翰特拉沃尔塔。当我运行此代码时,我总共得到3个MessageBoxes,其输出如下:

  • [4,Uma Thurman]与Uma Thurman相匹配
  • [5,Samuel L. Jackson]与Uma Thurman相匹配
  • [6,John Travolta]与Uma Thurman相匹配

虽然我真正想要实现的是它在找到Uma之后突破了循环,然后得到一个消息框说:

[5,Samuel L. Jackson]与Samuel L. Jackson比赛。等等。我想这样做,因为我想删除和/或插入从电影中选择/取消选择的演员。

var deleteMovieActors = db.MovieActors.Where(mid => mid.Movie_MovieId == MovieId).Select(a => a.Actor);

        foreach (var item in lstbActors.SelectedItems)
        {
            foreach (Actor a in deleteMovieActors)
            {
                if (lstbActors.SelectedItem.ToString().Contains(a.FirstName + " " + a.LastName))
                {
                    MessageBox.Show(item.ToString() + " Matches " + a.FirstName + " " + a.LastName);
                    break;
                } 
            }                        
        }

以下是我创建列表框的方法:

private void InitializeListBox()
    {
        var actors = new Dictionary<int, string>();

        foreach (var actor in db.Actors.ToList())
        {
            actors.Add(actor.ActorId, actor.FirstName + " " + actor.LastName);
        }

        lstbActors.DataSource = actors.ToList();
        lstbActors.ValueMember = "Key";
        lstbActors.DisplayMember = "Value";
        lstbActors.SelectedIndex = -1;

        // Get Actors by MovieId
        var MAct = from ma in db.MovieActors
                   where ma.Movie_MovieId == MovieId
                   select ma;

        List<Actor> act = new List<Actor>();

        foreach (var ma in MAct)
        {
            act.Add(db.Actors.Where(a => a.ActorId == ma.Actor_ActorId).Single());
        }

        foreach (Actor a in act)
        {
            int index = lstbActors.FindStringExact(a.FirstName + " " + a.LastName);
            if (index != -1)
            {
                lstbActors.SetSelected(index, true);
            }
        }
    }

2 个答案:

答案 0 :(得分:0)

问题出在IF语句的条件中。 SelectedItem属性在循环中反复出现第一次出现。

if (lstbActors.SelectedItem.ToString().Contains(a.FirstName + " " + a.LastName))
            {
                MessageBox.Show(item.ToString() + " Matches " + a.FirstName + " " + a.LastName);
                break;
            }

当我按如下方式更改代码时,它可以正常工作:

item.ToString().Contains(a.FirstName + " " + a.LastName

答案 1 :(得分:0)

如果你想要First和Last Name的完全匹配,请使用string.Equals()而不是contains,因为contains返回包含指定关键字的所有字符串,例如,如果你对字符串“Hello”使用contains for Hello“ “Hello World”,然后它会给你Hello和Hello World。