ListView项目没有移动

本文关键字:移动 项目 ListView | 更新日期: 2023-09-27 18:10:22

我试图通过按钮向上/向下移动选定的ListView项目。在同一索引处删除和插入项。但我想把它加到index+1(下)或index -1(上)

我有4个项目,并试图向下移动项目2(在索引1)下面是一个down_click过程的例子

private void down_Click(object sender, EventArgs e)
{
    ListViewItem selected = listView1.SelectedItems[0];
    int sel_index = listView1.SelectedItems[0].Index;
    int newindex = sel_index + 1;
    listView1.Items.RemoveAt(sel_index);
    listView1.Items.Insert(newindex, selected);
}

ListView项目没有移动

实际上你的代码没有任何问题。问题在于ListView。

当你使用ListView与视图属性设置为LargIcon(这是视图属性的默认值),SmallIcon或Tile视图,插入项目,不像预期的那样工作,但在列表和详细信息视图它工作如预期的

要克服这个问题,您可以执行以下任何操作:


解决方案1: (Workaround)


设置ListView的View属性为Details或List。


方案2:(更好更完整的方案)


为了在所有视图中克服这个问题,使用这个UpdateLayout方法,并在插入项后调用它。

private void UpdateLayout()
{
    if (this.listView1.View == View.LargeIcon ||
        this.listView1.View == View.SmallIcon ||
        this.listView1.View == View.Tile)
    {
        listView1.BeginUpdate();
        //Force ListView to update its content and layout them as expected
        listView1.Alignment = ListViewAlignment.Default;
        listView1.Alignment = ListViewAlignment.Top;
        listView1.EndUpdate();
    }
}

那么UpButton和DownButton代码可能是这样的:

private void UpButton_Click(object sender, EventArgs e)
{
    //If there is a selected item in ListView
    if (this.listView1.SelectedIndices.Count >= 0)
    {
        //If selected item is not the first item in list 
        if (this.listView1.SelectedIndices[0] > 0)
        {
            var index = this.listView1.SelectedItems[0].Index;
            var item = this.listView1.SelectedItems[0];
            this.listView1.Items.RemoveAt(index);
            this.listView1.Items.Insert(index - 1, item);
            this.UpdateLayout();
        }
    }
}
private void DownButton_Click(object sender, EventArgs e)
{
    //If there is a selected item in ListView
    if (this.listView1.SelectedIndices.Count >= 0)
    {
        //If selected item is not the last item in list 
        if (this.listView1.SelectedIndices[0] < this.listView1.Items.Count - 1)
        {
            var index = this.listView1.SelectedItems[0].Index;
            var item = this.listView1.SelectedItems[0];
            this.listView1.Items.RemoveAt(index);
            this.listView1.Items.Insert(index + 1, item);
            this.UpdateLayout();
        }
    }
}
<<p> 其他说明/strong>

要更好地查看ListView,请在设计器或代码中设置这些属性:

  • 设置MultiSelect为false,以防止选择多个项目
  • 设置FullRowSelect真正使选择通过点击在一行
  • 设置hidesselection = false,即使ListView没有焦点,也会突出选中的项目

您只需将listview的视图模式更改为list:

listView1.View = View.List;

我希望这对你有帮助。