【问题标题】:Number increments too much数字增量太多
【发布时间】:2013-09-12 17:00:00
【问题描述】:

我有一个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 循环中尝试了不同的变体,但没有成功。

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

【问题讨论】:

  • 如果你完全放弃 for 循环会发生什么?
  • 该项目是否一次移动不止一个点?如果不是,为什么要循环?只有两个项目会受到影响:移动的项目,以及前一个项目(与它交换位置)。

标签: c# list datagrid


【解决方案1】:

您的问题是,在这种情况下,只有两个项目的“顺序发生了变化”,但您增加了项目移动 下方每个人的数字。在这种情况下,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;

【讨论】:

  • 请注意,只要只有两个项目交换位置,这将正常工作。如果 OP 稍后允许用户将项目拖放到列表中的其他位置,则需要实现 for 机制来更新受影响行的 No. 列。
  • @MadHenchbot:是的。当 OP 提出这个问题时,我们可以帮助解决它。
  • 这是一个严重的“过度思考问题”的案例。我有一个想法,我必须改变一切。 回到地球谢谢。
【解决方案2】:

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

_bhaList[oldIndex].Number++;

【讨论】:

    【解决方案3】:

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

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

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

    【讨论】:

      【解决方案4】:

      你的 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;
      

      【讨论】:

        【解决方案5】:

        通过使用

        _bhaList.RemoveAt(oldIndex);
        
        bha.Number = oldIndex;
        
        _bhaList.Insert(newIndex, bha);
        

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-06-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-11-17
          • 2012-10-31
          相关资源
          最近更新 更多