什么是在C#中交换两个ListView项目的最佳方法?

时间:2010-03-16 18:11:41

标签: c# .net listview

在C#中交换两个ListView项目的最佳方法是什么?我看到标准的ListView没有实现这样的功能。

- 最好的祝福, 穆拉特

5 个答案:

答案 0 :(得分:1)

基于Murat的KnowDotNet文章参考,这里的扩展方法更灵活(它可以在任何项目上运行,而不仅仅是cursel),并且bugfixed(BeginUpdate / Endupdate for更少的闪烁,EnsureVisible和边界检查)。 不需要是扩展方法,但我喜欢它们:)

namespace YourApp
{
    public static class MyExtensions
    {
        // Based upon http://www.knowdotnet.com/articles/listviewmoveitem.html
        public static void MoveSelectedItem(this System.Windows.Forms.ListView lv, int idx, bool moveUp)
        {
            // Gotta have >1 item in order to move
            if(lv.Items.Count > 1)  
            {
                int offset = 0;
            if (idx >= 0)
            {
                if (moveUp)
                {
                    // ignore moveup of row(0)
                    offset = -1;
                }
                else
                {
                    // ignore movedown of last item
                    if (idx < (lv.Items.Count - 1))
                        offset = 1;
                }
            }

                if (offset != 0)
                {
                    lv.BeginUpdate();

                    int selitem = idx + offset;
                    for (int i = 0; i < lv.Items[idx].SubItems.Count; i++)
                    {
                        string cache = lv.Items[selitem].SubItems[i].Text;
                        lv.Items[selitem].SubItems[i].Text = lv.Items[idx].SubItems[i].Text;
                        lv.Items[idx].SubItems[i].Text = cache;
                    }

                    lv.Focus();
                    lv.Items[selitem].Selected = true;
                    lv.EnsureVisible(selitem);

                    lv.EndUpdate();
                }
            }
        }
      }
}

答案 1 :(得分:1)

如果您使用自定义ListViewItem或对象,则无法克隆对象或库存字符串:

enum Direction { UP = -1, DOWN = +1};

void ListViewMove(ListView lv, Direction direction)
{
    if (lv.SelectedItems.Count > 0)
    {
        int selIdx = lv.SelectedItems[0].Index;
        ListViewItem tmp = lv.Items[selIdx] ;

        if ( ( (selIdx != 0) && direction == Direction.UP ) ||
            ((selIdx!=lv.Items.Count-1) && (direction == Direction.DOWN)) )
        {          
            lv.Items.RemoveAt(selIdx);
            tmp = lv.Items.Insert(selIdx + (int)direction, tmp);
            tmp.Selected = true;
        }
    }
    lv.Focus();
}

答案 2 :(得分:0)

ASP.NET和Winforms ListView都具有Items属性,允许添加或删除项目。

答案 3 :(得分:0)

我写了一些应该有效的样本。

    ListViewItem[] copyOfItemsInListView1 = new ListViewItem[listView1.Items.Count];
    ListViewItem[] copyOfItemsInListView2 = new ListViewItem[listView2.Items.Count];

    listView1.Items.CopyTo(copyOfItemsInListView1, 0);
    listView2.Items.CopyTo(copyOfItemsInListView2, 0);

    listView1.Items.Clear();
    listView2.Items.Clear();

    for (int i = 0; i < copyOfItemsInListView2.Length; i++)
    {
        listView1.Items.Add(copyOfItemsInListView2[i]);
    }
    for (int i = 0; i < copyOfItemsInListView1.Length; i++)
    {
        listView2.Items.Add(copyOfItemsInListView1[i]);
    }

答案 4 :(得分:0)

克隆他们:

// move selected item up
int selectedIndex = mListView.SelectedIndices[0];
if (selectedIndex > 0)
{
   ListViewItem item1 = (ListViewItem)mListView.Items[selectedIndex - 1].Clone();
   ListViewItem item2 = (ListViewItem)mListView.Items[selectedIndex].Clone();
   mListView.Items[selectedIndex - 1] = item2;
   mListView.Items[selectedIndex] = item1;

   mListView.SelectedIndices.Remove(selectedIndex);
   mListView.SelectedIndices.Add(selectedIndex - 1);
}