我有一个DataGrid
,绑定到List
:_bhaList
。
现在,我编写了一个方法,允许用户选择网格上的项目并将其向上移动。随着它向上移动,No.
列会更新以显示其当前位置。但是,在这种特殊情况下,如果我有3个项目,如果我选择No. 2
,然后将其向上移动,则会切换No. 1
个地方,并且这些数字会更新,但No. 3
会更改为4.如果我重复此过程,新No. 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
循环中尝试了不同的变体,但没有成功。
我觉得这将是非常简单的事情,但我的思想却没有看到它。
答案 0 :(得分: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;
答案 1 :(得分:0)
如果你的物品一次只能移动一个点,则不需要循环,可以用以下内容替换:
_bhaList[oldIndex].Number++;
答案 2 :(得分:0)
您只需要重新洗牌/交换位置,
当你_bhaList.Insert(newIndex, bha);
时,它会将计数增加1。
只能replacing
这两个选定的索引。
答案 3 :(得分: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;
答案 4 :(得分:0)
使用
_bhaList.RemoveAt(oldIndex);
bha.Number = oldIndex;
_bhaList.Insert(newIndex, bha);
您已将项目移至新索引。 .NET将根据需要推送所有其他元素,而无需您这样做。因此,不需要for
循环。
要解决您的问题,只需删除for循环。