【问题标题】:How to put an item from a middle of a list, on a first place?如何将列表中间的项目放在首位?
【发布时间】:2019-03-09 11:48:36
【问题描述】:

我有一个绑定列表:

BindingList<partner> partnerList = _context.partner.Local.ToBindingList();

this._view.PartnerDatasource.DataSource = partnerList;

这是一个下拉菜单的数据源。我想要的是把一个特定的项目显示为下拉列表中的第一个项目。我尝试过这样的事情:

 public  void Swap<T>(IList<T> list, int indexA, int indexB)
        {
            T tmp = list[indexA];
            list[indexA] = list[indexB];
            list[indexB] = tmp;
        }

然后:

 this.Swap(partnerList, 0, partnerList.Count - 1);

这在交换时有效,但它以某种方式完全弄乱了实体框架,当我尝试使用这些实体(合作伙伴)时,我会进一步遇到各种错误......

什么是合适的方法来做到这一点?

【问题讨论】:

  • “完全搞乱了实体框架,当我尝试使用这些实体时,我会进一步遇到各种错误” - 怎么回事?
  • @Enigmativity 不知道。错误太多了,比如“不允许添加与处于已删除状态的实体的关系”等等……那个交换功能搞砸了。
  • 错误什么时候发生?
  • 当我尝试将另一个与合作伙伴实体相关的实体添加到上下文中时。 @韩
  • 为什么要交换列表中的元素?它是数据库中的基础数据,交换任何元素对数据库没有任何积极影响。如果您需要为用户排序或重新排序,您应该在视图中而不是在基础数据中执行此操作。

标签: c# winforms entity-framework-6 datasource bindinglist


【解决方案1】:

给他们优先级,然后按它排序:

partnerList.OrderByDesending(x=> x.someProperty == Something); 

或者如果您需要按索引排序:

  partnerList.Select((item ,i) => new { item , neworder = i == index ? 0 : 1})
           .OrderBy(x=> x.neworder).Select(a=> a.item); 

Live Demo

【讨论】:

  • 实际上它既可以使用属性排序,也可以使用属性索引
【解决方案2】:

List 没有实现 Move(Int32 oldIndex, Int32 newIndex) 方法,但 ObservableCollection 可以。

所以你可以做的是,首先将该列表转换为 ObservableCollection 并尝试使用 .Move(Int32 oldIndex, Int32 newIndex) 方法。

using System;
using System.Collections.ObjectModel;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {

        List<Partner> partenrs=new List<Partner>();
        partenrs.Add(new Partner(){Name="A"});
        partenrs.Add(new Partner(){Name="B"});
        partenrs.Add(new Partner(){Name="C"});
        partenrs.Add(new Partner(){Name="D"});
        partenrs.Add(new Partner(){Name="E"});
        partenrs.Add(new Partner(){Name="F"});

        var obser=new ObservableCollection<Partner>(partenrs);

        obser.Move(0,5);
        foreach(var x in obser)
        {
            Console.WriteLine(x.Name);
        }
    }
}

class Partner
{
    public string Name{get;set;}
}

【讨论】:

  • 抱歉,没有时间尝试所有示例,但未来的读者可能会尝试它们。感谢发帖!
【解决方案3】:
var names = new [] { "Alice", "Bob", "Charlie", "Dave", "Eve" };
var specialName = "Eve";

var sortedNames = names.OrderByDescending(x => x == specialName);
foreach (var name in sortedNames)
    Console.WriteLine(name);

结果:

Eve
Alice
Bob
Charlie
Dave

【讨论】:

  • 所以我做的是按照你说的订购东西,然后`this._view.PartnerDatasource.DataSource = new BindingList(result.ToList());`将结果转换为绑定列表。它似乎正在工作......
猜你喜欢
  • 1970-01-01
  • 2015-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-25
  • 2012-10-08
  • 2018-12-02
相关资源
最近更新 更多