如何在列表视图中自动将每个项目的一个索引移动?

时间:2014-01-29 23:10:06

标签: c# winforms listview indexing

这是Form1构造函数中的代码:

public Form1()
{
    InitializeComponent();

    ColumnHeader header = new ColumnHeader();
    header.Text = "";
    header.Name = "col1";
    listView1.Columns.Add(header);
    listView1.View = View.Details;
    listView1.Scrollable = true;
    readableRss = RssReader.covertRss("http://rotter.net/rss/rotternews.xml");

    lines = Regex.Split(readableRss, "\r\n").ToList();

    for (int i = 0; i < lines.Count; i++)
    {
        listView1.Items.Add(lines[i]);
    }
    header.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);

    for (int i = 0; i < listView1.Items.Count; i++)
    {
        var currentIndex = listView1.SelectedItems[i].Index;
        var item = listView1.Items[i];
        if (currentIndex > 0)
        {
            listView1.Items.RemoveAt(currentIndex);
            listView1.Items.Insert(currentIndex - 1, item);
        }
    }

在FOR循环中我收到错误,因为listView1.SelectedItems[i].Index;不能为0索引。

我的目标是将listBox1中的每个项目平稳缓慢地移动到一个位置,并将其下方的项目向上移动等等所有项目在无限循环中,当最后一个项目到达顶部时底部用第一个项目再次重复它。就像一个行选框效果。

我该怎么做?

这就是我尝试过的。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Text.RegularExpressions;

namespace RssNewsFeeder
{
    public partial class Form1 : Form
    {
        int lastIndex;
        string readableRss;
        private List<string> lines = new List<string>();

        public Form1()
        {
            InitializeComponent();

            ColumnHeader header = new ColumnHeader();
            header.Text = "";
            header.Name = "col1";
            listView1.Columns.Add(header);
            listView1.View = View.Details;
            listView1.Scrollable = true;
            readableRss = RssReader.covertRss("http://rotter.net/rss/rotternews.xml");

            lines = Regex.Split(readableRss, "\r\n").ToList();

            for (int i = 0; i < lines.Count; i++)
            {
                listView1.Items.Add(lines[i]);
            }
            header.AutoResize(ColumnHeaderAutoResizeStyle.ColumnContent);
            timer1.Enabled = true;           
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            this.Refresh();
            int i = listView1.TopItem == null ? -1 : listView1.TopItem.Index;
            if (i > -1)
            {
                if (i == lastIndex || i == listView1.Items.Count - 2) i = 0;
                lastIndex = i;
                listView1.TopItem = listView1.Items[++i];
            }
        }
    }
}

我添加了一个计时器,在计时器滴答事件中,我正在这样做。 它的工作但问题是它没有移动平稳,但每次一个地方都会跳线。我希望它能在电影结束时顺畅地移动,当你看到积分向上移动时。

我应该在计时器刻度事件代码中更改/添加什么?

编辑**

这就是我现在在计时器刻度事件中所做的:

this.Invalidate();
            var r = Enumerable.Empty<ListViewItem>();

            if (this.listView1.Items.Count > 0)
                r = this.listView1.Items.OfType<ListViewItem>();

            var last = r.LastOrDefault();

            if (last != null)
            {
                listView1.Items.Insert(0, last);
                listView1.Items.Remove(last);
            }

但我得到例外:无法在多个地方添加或插入项目。您必须先将其从当前位置删除或克隆它

我做错了什么?

1 个答案:

答案 0 :(得分:1)

在你的计时器中尝试这种方式:

int count;
if ((count = listView1.Items.Count) > 0)
{
   var LastItem = listView1.Items[count - 1];
   listView1.Items.Remove(LastItem);
   listView1.Items.Insert(0, LastItem);
}