1

假设我有这样的 Car 类:

class car 
{
string model;
int position;
}   

position 是一个从 1 到 n 的数字,基本反映了在列表中的位置。如果我在列表中有两辆车,它们的位置将是 1 2。现在,我想在 UI 的列表中重新排序这些汽车,并反映属性中的更改以供以后使用。
所以我有一个有几行的表:

Car1  1  
Car2  2     
Car3  3   
Car4  4   

现在,如果我想重新排序项目,我可以拖动 Car4 并将其放置在位置 2(就在 Car1 之后)。
所以,我的职位如下:

Car1  1  
Car4  2     
Car2  3   
Car3  4    

所以,我想要做的是更新列表中的一项,而其他所有项目都会自动更新。

4

2 回答 2

3

在这种情况下,最好的方法是根本不存储位置,而是隐含它。保留model属性,并删除position. 每当您需要位置或与其位置配对的所有元素的列表时,您可以使用Select采用索引的 LINQ 重载:

var carsWithIndex = carList.Select((car, index) => new {
    Car = car
,   Index = index
}).ToList();

现在您有一个具有两个属性的对象列表:

  • Car-car列表的元素,以及
  • Indexcar- 中对应的索引carList

可以随意对元素重新排序carList;每次重新订购时,隐含索引都会发生变化。每次需要索引时,运行上面的 LINQ 表达式以将每个表达式car与其新索引配对。

于 2012-12-10T02:26:22.733 回答
0

我猜是这样的:

BindingList<car> list = new BindingList<car>();
list.ListChanged += new ListChangedEventHandler(list_ListChanged);

void list_ListChanged(object sender, ListChangedEventArgs e)
        {
            list[e.OldIndex].position = e.NewIndex;
            for (int i = e.NewIndex; i < list.Count; i++)
            {
                list[i].position = i+1;
            }
        }
于 2012-12-10T02:29:40.820 回答