【问题标题】:ListView moving itemsListView 移动项目
【发布时间】:2009-07-27 17:01:48
【问题描述】:

ListView 有另一个问题 :( 现在我需要在组中移动项目(向上、向下、到开头、到末尾),但 ListView 总是在末尾显示移动的项目。

这是将项目移到开头的示例代码:

   if (1 == listView1.SelectedItems.Count)
    {

        ListViewItem item = listView1.SelectedItems[0];
        ListViewGroup gp = item.Group;

        int index;
        index = item.Index;

        if (index < listView1.Items.Count)
        {

            index = 0;

            listView1.Items.Remove(item);

            item.Group = gp;

            listView1.Items.Insert(index, item);
        }
    }

我尝试谷歌寻找一些解决方案,我找到了和我有同样问题的其他人 (http://social.msdn.microsoft.com/Forums/en-US/winforms/thread/838f90cd-33d8-4c81-9ed9-85220b511afe),但他的解决方案不起作用:(

我考虑过使用 ObjectListView 但我修改了 ListView 女巫现在支持拖放与 WinAmp 效果、onScroll 事件、滚动同步等。我不想失去这些东西 :(

【问题讨论】:

  • 您最后一次查看 ObjectListView 是什么时候?它对拖放和 OnScroll 事件有很好的支持。它内置了对通过拖动重新排列项目的支持。
  • [诚然,重新排列在组内不起作用] :)
  • +1 发现自己在同一条船上 - 试图将项目插入和/或移动到 ListView 中的特定索引。另外,感谢您对 ObjectListView 的提醒——我们稍后会研究。

标签: c# winforms listview


【解决方案1】:

试试这个:

/// <summary>
/// Move the given item to the given index in the given group
/// </summary>
/// <remarks>The item and group must belong to the same ListView</remarks>
public void MoveToGroup(ListViewItem lvi, ListViewGroup group, int indexInGroup) {
    group.ListView.BeginUpdate();
    ListViewItem[] items = new ListViewItem[group.Items.Count + 1];
    group.Items.CopyTo(items, 0);
    Array.Copy(items, indexInGroup, items, indexInGroup + 1, group.Items.Count - indexInGroup);
    items[indexInGroup] = lvi;
    for (int i = 0; i < items.Length; i++)
        items[i].Group = null;
    for (int i = 0; i < items.Length; i++) 
        group.Items.Add(items[i]);
    group.ListView.EndUpdate();
}

【讨论】:

  • 这会引发 System.ArgumentException "无法在多个位置添加或插入项目 ''。
  • 这是生产代码——我知道它可以工作。那么,你能告诉我更多关于它抛出异常时发生的事情吗?哪条线? indexInGroup 的值是多少?该组已有多少项目? [我还假设您注意了备注部分]
  • 哦,我是白痴:D 我将 1 个组分配给 3 个 ListViews...它位于不同的代码块中,所以当您说您的代码有效时我注意到了它...现在它确实有效。谢谢!
【解决方案2】:

我对这个问题的自动回复是检查你说的是否有效

listView1.Items.Count - 1

因为列表是零索引的,所以计数比最后一个索引大 1)

【讨论】:

  • 我不认为这可能是个问题。例如:有 4 个项目的 Listview 的第一个索引为 0,最后一个索引为 3。如果 (index
【解决方案3】:

查看代码,它有一些让我好奇的问题。看起来问题可能是最初的 if 语句。如果 itemlist 中只有 1 个项目,则无论您将其粘贴在何处,都将其删除并重新添加它不会做任何事情。我相信你想要

此外,您在从您感兴趣的项目中获取索引后立即将其设置为 0。如果代码应该将其移动到顶部,则应该将 Index=0 移动到 if 语句中。

不知道这些是否能解决问题...

【讨论】:

  • 第一个 if 表示如果 ListView 中只有 1 个 SELECTED 项目,而不是 1 个项目 :-) 并且 index = 0 你是对的......我更正了它,但它没有解决问题.
  • 哦!选定的项目。我看错了。我猜想问题出在 listView1.Items.Insert(index, item);我会在那里写一个调试语句并检查所有变量以确保它们是好的,然后看看你是否可以进入其中看看它是否会转到其他地方的一些用户定义的代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-13
  • 2015-07-31
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多