【问题标题】:Can move multiple items simultaneously in ListBox up the list, but not down?可以同时将 ListBox 中的多个项目向上移动,但不能向下移动?
【发布时间】:2015-07-24 06:02:39
【问题描述】:

我有一个奇怪的错误,我很难弄清楚。

如果我在我的 ListBox 中选择多个项目,然后选择向上箭头,则所有项目都会完美地向上移动一个空格,就好像它们是一个单元一样。但是,当单击向下箭头将列表中的每个项目向下移动一个位置时,不会发生这种情况。

相反,如果我选择偶数个项目然后单击向下箭头,则所有项目都不会移动,如果我选择奇数个项目然后单击向下箭头,则只有底部的项目会向下移动一个空间,而所有其他空间都留在原地。

有人知道为什么会发生这种情况吗?

这是我用来处理物品移动的代码:

private void MoveItemInSelectedItemsListBox(object sender)
{
  if (selectedItemsListBox.SelectedItems.Count > 0)
  {
    // Build list of items to be moved
    List<object> listOfItemsToBeMoved = new List<object>();

    for (int i = 0; i < selectedItemsListBox.SelectedItems.Count; i++)
    {
      listOfItemsToBeMoved.Add(selectedItemsListBox.SelectedItems[i]);
    }

    for (int k = 0; k < listOfItemsToBeMoved.Count; k++)
    {
      var selectedItem = listOfItemsToBeMoved[k];
      int selectedItemIndex = selectedItemsListBox.Items.IndexOf(selectedItem);
      int numberOfItemsInList = selectedItemsListBox.Items.Count;

      // If up arrow was clicked
      if (sender.ToString().Contains("▲"))
      {
        if (selectedItemIndex == 0)
        {
          selectedItemsListBox.Items.Remove(selectedItem);
          selectedItemsListBox.Items.Insert(numberOfItemsInList - 1, selectedItem);
          selectedItemsListBox.SetSelected(numberOfItemsInList - 1, true);
        }
        else
        {
          selectedItemsListBox.Items.Remove(selectedItem);
          selectedItemsListBox.Items.Insert(selectedItemIndex - 1, selectedItem);
          selectedItemsListBox.SetSelected(selectedItemIndex - 1, true);
        }
      }
      // If down arrow was clicked
      else if (sender.ToString().Contains("▼"))
      {
        if (selectedItemIndex == numberOfItemsInList - 1)
        {
          selectedItemsListBox.Items.Remove(selectedItem);
          selectedItemsListBox.Items.Insert(0, selectedItem);
          selectedItemsListBox.SetSelected(0, true);
        }
        else
        {
          selectedItemsListBox.Items.Remove(selectedItem);
          selectedItemsListBox.Items.Insert(selectedItemIndex + 1, selectedItem);
          selectedItemsListBox.SetSelected(selectedItemIndex + 1, true);
        }
      }
    }
  }

}

【问题讨论】:

    标签: c# .net winforms


    【解决方案1】:

    for 循环的方向有问题:本质上,当向下移动项目时,如果您实际上是在列表中移动向上,同时检查要向下移动的项目 ,你最终会遇到重叠和其他奇怪的事情。如果您要向下移动项目,我的解决方案是简单地循环向下移动项目:

    if (selectedItemsListBox.SelectedItems.Count > 0)
    {
        List<object> itemsToMove = (from object item in selectedItemsListBox.SelectedItems select item).ToList();
        int numItems = selectedItemsListBox.Items.Count;
    
        // If up arrow was clicked
        if (sender.ToString().Contains("▲"))
        {
            for (int i = 0; i < itemsToMove.Count; i++)
            {
                var selectedItem = itemsToMove[i];
                int oldIndex = selectedItemsListBox.Items.IndexOf(selectedItem);
                int newIndex = oldIndex == 0 ? numItems - 1 : oldIndex - 1;
    
                selectedItemsListBox.Items.Remove(selectedItem);
                selectedItemsListBox.Items.Insert(newIndex, selectedItem);
                selectedItemsListBox.SetSelected(newIndex, true);
            }
        }
        // If down arrow was clicked
        else if (sender.ToString().Contains("▼"))
        {
            for (int i = itemsToMove.Count - 1; i >= 0; i--)
            {
                var selectedItem = itemsToMove[i];
                int oldIndex = selectedItemsListBox.Items.IndexOf(selectedItem);
                int newIndex = oldIndex == numItems - 1 ? 0 : oldIndex + 1;
    
                selectedItemsListBox.Items.Remove(selectedItem);
                selectedItemsListBox.Items.Insert(newIndex, selectedItem);
                selectedItemsListBox.SetSelected(newIndex, true);
            }
        }
    }
    

    (我还冒昧地使一些代码更小,例如通过更改一些变量名。)

    【讨论】:

    • 效果很好,非常感谢。我没有想过以这种方式使用 for 循环上下移动。感谢您与我分享!
    【解决方案2】:

    发现这个example 可能是一个更好、更清晰且可重复使用的选项。

    public class SmartListBox : ListBox
    {
        //Moves the selected items up one level
        public MoveUp()
        {
    
            for(int i = 0; i < Items.Count; i++)
            {
                if (Items[i].Selected)//identify the selected item
                {
                    //swap with the top item(move up)
                    if (i > 0 && !Items[i - 1].Selected)
                    {
                         ListItem bottom = Items[i];
                         Items.Remove(bottom);
                         Items.Insert(i - 1, bottom);
                         Items[i - 1].Selected = true;
                     }
                  }
              }
         }
    
         //Moves the selected items one level down
         public MoveDown()
         {
             int startindex = Items.Count -1;
             for (int i = startindex; i > -1; i--)
             {
                  if (Items[i].Selected)//identify the selected item
                  { 
                      //swap with the lower item(move down)
                      if (i < startindex && !Items[i + 1].Selected)
                      {
                           ListItem bottom = Items[i];
                           Items.Remove(bottom);
                           Items.Insert(i + 1, bottom);
                           Items[i + 1].Selected = true;
                      }
    
                  }
             }
         }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多