2

我有 a DataGrid,它绑定到 a List: _bhaList

在此处输入图像描述

现在,我编写了一个允许用户选择网格上的项目并将其向上移动的方法。当它向上移动时,该No.列会更新以显示它的当前位置。但是,在这种特殊情况下,我有 3 个项目,如果我选择No. 2并将其向上移动,它No. 1确实No. 3No. 4与5.

在此处输入图像描述

这是我尝试过的代码:

var oldIndex = grdBha.SelectedIndex;
var newIndex = oldIndex - 1;
var bha = _bhaList[oldIndex];

_bhaList.RemoveAt(oldIndex);

bha.Number = oldIndex;

_bhaList.Insert(newIndex, bha);

for (var i = newIndex + 1; i <= _bhaList.Count; i++)
{
    if (i != _bhaList.Count)
    {
        _bhaList[i].Number += 1;
    }
}

我在for循环中尝试了不同的变体,但没有成功。

我有一种感觉,这将是一件非常简单的事情,但我的大脑并没有看到它。

4

5 回答 5

2

您的问题是,在这种情况下,只有两个项目的“顺序发生了变化”,但是您为移动项目下方的每个人增加了数字。在这种情况下Bit X/O Sub是 3,但会增加到 4。

您知道仅涉及两个索引:

// swap the two
var temp = _bhaList[newIndex];
_bhaList[newIndex] = _bhaList[oldIndex];
_bhaList[oldIndex] = temp;

_bhaList[newIndex].Number = newIndex + 1;
_bhaList[oldIndex].Number = oldIndex + 1;
于 2013-09-12T17:10:30.210 回答
0

如果您的项目一次只能移动一个点,则循环是不必要的,可以用以下内容替换:

_bhaList[oldIndex].Number++;
于 2013-09-12T17:07:15.653 回答
0

您只需要重新洗牌/交换位置,

当您_bhaList.Insert(newIndex, bha);将计数增加 1 时。

replacing仅通过这两个选定的索引进行尝试。

于 2013-09-12T17:07:26.297 回答
0

你的 for 循环没有意义,你不需要增加每个项目的数量。仅当您在列表中添加新项目时才需要执行此操作。

var oldIndex = grdBha.SelectedIndex;
var newIndex = oldIndex - 1;
var oldBha = _bhaList[oldIndex];
var newBha = _bhaList[newIndex];

oldBha.Number--;
newBha.Number++;

_bhaList.RemoveAt(oldIndex);
_bhaList.Insert(newIndex, oldBha);

或者

_bhaList[oldIndex] = newBha;
_bhaList[newIndex] = oldBha;
于 2013-09-12T17:10:40.053 回答
0

通过使用

_bhaList.RemoveAt(oldIndex);

bha.Number = oldIndex;

_bhaList.Insert(newIndex, bha);

您已将该项目移至新索引。.NET 将根据需要下推所有其他元素,而无需您这样做。因此,不需要for循环。

要解决您的问题,只需删除 for 循环。

于 2013-09-12T17:26:33.473 回答