C# - 如何在列表框内上下移动多个项目(Windows窗体)

时间:2017-08-25 14:21:52

标签: c# winforms listbox

我在Windows窗体应用程序中有一个ListBox。 我可以使用以下脚本轻松地在列表框中上下移动单个项目:

int newIndex = inputFiles.SelectedIndex + direction;

if (newIndex < 0)
   newIndex = inputFiles.Items.Count-1;

if (newIndex >= inputFiles.Items.Count)
    newIndex = 0;

object selected = inputFiles.SelectedItem;

inputFiles.Items.Remove(selected);
inputFiles.Items.Insert(newIndex, selected);
inputFiles.SetSelected(newIndex, true);

如何移动多个所选项目?谢谢大家!

3 个答案:

答案 0 :(得分:1)

我认为没有一种特定的方法可以在列表框中移动List。有一个AddRange()可以将它全部设置到列表的底部。

您可以尝试制作自己的InsertRange()。

List<object> toInsert = new List<object>();
toInsert.Add(selected);


InsertRange(int startIndex){
     foreach(object o in toInsert){
          inputFiles.Items.Insert(startIndex, o);
          startIndex++;
     }
}

这可能不会完全正常,但我认为这可能是你所要求的。

答案 1 :(得分:1)

如果将所选索引复制到数组中,则可以循环遍历项目并相应地更新索引:

private void btnDown_Click(object sender, EventArgs e) {
  listBox1.BeginUpdate();
  int[] indexes = listBox1.SelectedIndices.Cast<int>().ToArray();
  if (indexes.Length > 0 && indexes[indexes.Length - 1] < listBox1.Items.Count - 1) {
    for (int i = listBox1.Items.Count - 1; i > -1; --i) {
      if (indexes.Contains(i)) {
        object moveItem = listBox1.Items[i];
        listBox1.Items.Remove(moveItem);
        listBox1.Items.Insert(i + 1, moveItem);
        listBox1.SetSelected(i + 1, true);
      }
    }
  }
  listBox1.EndUpdate();
}

private void btnUp_Click(object sender, EventArgs e) {
  listBox1.BeginUpdate();
  int[] indexes = listBox1.SelectedIndices.Cast<int>().ToArray();
  if (indexes.Length > 0 && indexes[0] > 0) {
    for (int i = 0; i < listBox1.Items.Count; ++i) {
      if (indexes.Contains(i)) {
        object moveItem = listBox1.Items[i];
        listBox1.Items.Remove(moveItem);
        listBox1.Items.Insert(i - 1, moveItem);
        listBox1.SetSelected(i - 1, true);
      }
    }
  }
  listBox1.EndUpdate();
}

答案 2 :(得分:0)

这对我有用。

/// <summary>
/// Extension allow move with multiple selected items 
/// </summary>
static class ListBoxExtension {
    /// <summary>
    /// Moves the selected items up one level
    /// </summary>
    /// <param name="xListBox"></param>
    public static void MoveUp(ListBox xListBox) {
        if(xListBox.SelectedItems.Count > 0) {
            if(xListBox.SelectedIndices[0] > 0) {
                foreach(int i in xListBox.SelectedIndices) {
                    object NewItem = xListBox.Items[i];
                    xListBox.Items.Remove(NewItem);
                    xListBox.Items.Insert(i - 1, NewItem);
                    xListBox.SelectedItem = NewItem;
                }
            }
        }
    }

    /// <summary>
    /// Moves the selected items one level down
    /// </summary>
    /// <param name="xListBox"></param>
    public static void MoveDown(ListBox xListBox) {
        if(xListBox.SelectedItems.Count > 0) {
            int LastSelectedIndex = xListBox.SelectedIndices[xListBox.SelectedIndices.Count - 1];
            int LastIndex = xListBox.Items.Count - 1;

            if(LastSelectedIndex < LastIndex) {
                foreach(int i in xListBox.SelectedIndices) {
                    object NewItem = xListBox.Items[i];
                    xListBox.Items.Remove(NewItem);
                    xListBox.Items.Insert(i + 1, NewItem);
                    xListBox.SelectedItem = NewItem;
                }
            }
        }
    }
}