c# - ListView 项目不移动

标签 c# winforms listview

我正在尝试通过按钮向上/向下移动选定的 ListView 项目。 该项目被删除并插入到同一索引处。但我想将其添加到索引+1(向下)或索引-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 并将 View 属性设置为 LargIcon(即 view 属性的默认值)、SmallIcon 或 Tile View 时,插入项目不会按预期工作,但在列表和详细信息 View 中它会按预期工作。

要解决此问题,您可以执行以下任一操作:


解决方案 1:(解决方法)


设置View property ListView 到详细信息或列表。


解决方案 2:(更好、更完整的解决方案)


要解决所有 View 中的问题,请使用此 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();
        }
    }
}

附加说明


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

  • 设置MultiSelect设置为 false,以防止选择多个项目
  • 设置FullRowSelect设置为 true 可通过单击行中的任意位置来启用选择
  • 设置HideSelection = false 即使 ListView 没有焦点也会突出显示所选项目

关于c# - ListView 项目不移动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32299729/

相关文章:

c# - 动态添加行到 MVC View 然后传递给 Controller

c# - 为什么元组在 `[Serializable]` 时没有无参数构造函数?

c# - 防止类被实例化

android - 如何解决滚动列表页面时不选择总 ListView ?

android 在 ListView 中选择多个项目?

c# - 将字符串发布到 mvc

c# - 禁用工具条菜单时如何使文本颜色保持黑色?

C# 屏幕分辨率和窗体显示

Android:更改 ListView 中存在的 ImageView 的来源

c# - 如何在大图像中定位图像部分的坐标?