C# ListView使用向上和向下按钮移动项目.NET Framework

C# ListView使用向上和向下按钮移动项目.NET Framework,c#,winforms,listview,.net-4.0,C#,Winforms,Listview,.net 4.0,我有个问题 我有一个列表视图,其中包含随机数目的项目(根据文档的页面)。但是我需要有重新排序这些页面(即listview项)的选项。我在两个按钮(向上和向下)上都使用了一个函数,但它没有正确地重新排序。例如:我有两个项目(第1页和第2页),我想将第2页移动到位置0,它会移动,但在listview中它仍然显示以前的顺序。在其他例子中,我用了更多的页面。 下面是代码和他的电话 private void moveImgList(int direction) { if (list

我有个问题

我有一个列表视图,其中包含随机数目的项目(根据文档的页面)。但是我需要有重新排序这些页面(即listview项)的选项。我在两个按钮(向上和向下)上都使用了一个函数,但它没有正确地重新排序。例如:我有两个项目(第1页和第2页),我想将第2页移动到位置0,它会移动,但在listview中它仍然显示以前的顺序。在其他例子中,我用了更多的页面。 下面是代码和他的电话

private void moveImgList(int direction)
    {
        if (list_image.SelectedItems == null) { return; }

        ListViewItem item = list_image.SelectedItems[0];

        int newIndex = item.Index + direction;

        if (newIndex < 0 || newIndex >= list_image.Items.Count) { return; }

        list_image.Items.Remove(item);
        list_image.Items.Insert(newIndex, item);

    }
应用程序Windows窗体.NET框架

就是这样

private void moveItem(int direction)
    {
        if (listView1.SelectedItems.Count == 0) { return; }

        ListViewItem item = listView1.SelectedItems[0];

        int newIndex = item.Index + direction;

        if (newIndex < 0 || newIndex >= listView1.Items.Count) { return; }

        var currentView = listView1.View;
        listView1.BeginUpdate();
        listView1.View = View.Details;
        listView1.Items.Remove(item);
        listView1.Items.Insert(newIndex, item);
        listView1.EnsureVisible(newIndex);
        listView1.View = currentView;
        listView1.EndUpdate();
    }
private void moveItem(内部方向)
{
如果(listView1.SelectedItems.Count==0){return;}
ListViewItem项=listView1。选择编辑项[0];
int newIndex=项目索引+方向;
如果(newIndex<0 | | newIndex>=listView1.Items.Count){return;}
var currentView=listView1.View;
listView1.BeginUpdate();
listView1.View=View.Details;
listView1.Items.Remove(项目);
listView1.Items.Insert(新建索引,项);
listView1.EnsureRevible(新索引);
listView1.View=currentView;
listView1.EndUpdate();
}

尝试调用列表视图对象上的
BeginUpdate()
EndUpdate()
方法。这将强制UI重新绘制控件

 list_image.BeginUpdate();
 list_image.Items.Remove(item);
 list_image.Items.Insert(newIndex, item);
 list_image.EndUpdate();

删除某个项目时,索引会发生更改,可能会插入错误的位置,如果它是最后一个项目,甚至会出现异常。我认为交换两个项目更好:

private void moveImgList(int direction)
{
    if (list_image.SelectedItems == null) return; 
    int index = list_image.SelectedIndex;
    if((direction == -1 && index == 0) || (index == list_image.Items.Count - 1 && direction =1)
        return;
    int newIndex = index + direction;
    tmp = list_image.Items[index].Clone();
    list_image.Items[index] = (ListViewItem)list_image.Items[newIndex].Clone();
    list_image.Items[newIndex] = (ListViewItem)tmp;
}
这样就行了:

private void btnLeft_Click(object sender, EventArgs e)
{
    moveImgList(-1);
}

private void btnRight_Click(object sender, EventArgs e)
{
    moveImgList(1);
}

还添加了BeginUpdate()和EndUpdate()。很遗憾,未成功。错误:System.ArgumentException:'无法在多个位置添加或插入项目'Page 1'。首先,您需要将其从当前位置删除或克隆。是否确定?因为此代码既不添加也不插入,而且您正在使用
moveImgList(-1)
moveImgList(1)?我不得不对编译代码进行一些修改,但在执行时,如果(list_image.SelectedItems==null)返回,就会出现我提到的错误
;ListViewItem项目=列表\图像。选择编辑项[0];int index=item.index;if((direction=-1&&index==0)| |(index==list_image.Items.Count-1&&direction==1))返回;int newIndex=索引+方向;ListViewItem tmp=list_image.Items[索引];list_image.Items[index]=list_image.Items[newIndex];list_image.Items[newIndex]=tmp您的代码按预期工作。在
BeginUpdate()
EndUpdate()
序列中执行索引更改只会消除闪烁。删除
Refresh()
,这不是必需的。您可以添加
list\u image.Focus()中,在调用
moveImgList()
后单击
事件(以便更好地查看索引更改:所选项目将保持可见选中状态)。我将
list_image.Focus()放置在,但它也不起作用。我仍然有同样的问题,这是,我刚刚添加了
list\u image.ensureavible(newIndex)。怎么了?这是我在这里工作的代码
private void btnLeft_Click(object sender, EventArgs e)
{
    moveImgList(-1);
}

private void btnRight_Click(object sender, EventArgs e)
{
    moveImgList(1);
}