繁体   English   中英

c#将ListView数据存储到数组中并按升序排序

[英]c# Storing ListView Data into an Array and Sorting in Ascending Order

我创建了一个Windows窗体应用程序,在其中将信息添加到列表视图中,但是我想在下次打开程序时存储信息。 如何将列表视图信息存储到数组中,以及如何按升序(截止日期)对其进行排序。

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;

namespace WindowsFormsApplication6
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

    private void Form1_Load(object sender, EventArgs e)
    {
        listView1.View = View.Details;
        listView1.FullRowSelect = true;

        listView1.Columns.Add("Due Date", 150);
        listView1.Columns.Add("Module", 150);
        listView1.Columns.Add("Title", 150);
    }

    private void add(string DueDate, String Module, String Title)
    {
        string[] row = { DueDate, Module, Title };
        ListViewItem item = new ListViewItem(row);

        listView1.Items.Add(item);
    }

    private void listView1_MouseClick(object sender, MouseEventArgs e)
    {
        String Duedate = listView1.SelectedItems[0].SubItems[0].Text;
        String Module = listView1.SelectedItems[0].SubItems[1].Text;
        String Title = listView1.SelectedItems[0].SubItems[2].Text;

        textBox1.Text = Duedate;
        textBox2.Text = Module;
        textBox3.Text = Title;
    }

    private void btnAdd_Click(object sender, EventArgs e)
    {
        add(textBox1.Text, textBox2.Text, textBox3.Text);

        textBox1.Text = "";
        textBox2.Text = "";
        textBox3.Text = "";
    }

    private void btnClear_Click(object sender, EventArgs e)
    {
        listView1.Items.Clear();

        textBox1.Text = "";
        textBox2.Text = "";
        textBox3.Text = "";
    }

    private void update()
    {
        listView1.SelectedItems[0].SubItems[0].Text = textBox1.Text;
        listView1.SelectedItems[0].SubItems[1].Text = textBox2.Text;
        listView1.SelectedItems[0].SubItems[2].Text = textBox3.Text;

        textBox1.Text = "";
        textBox2.Text = "";
        textBox3.Text = "";
    }

    private void btnUpdate_Click(object sender, EventArgs e)
    {
        update();
    }

    private void delete()
    {
        if(MessageBox.Show("Are you sure you want to Delete", "Delete", MessageBoxButtons.OKCancel,MessageBoxIcon.Warning)== DialogResult.OK)
        {
            listView1.Items.RemoveAt(listView1.SelectedIndices[0]);

            textBox1.Text = "";
            textBox2.Text = "";
            textBox3.Text = "";
        }
    }

    private void btnDelete_Click(object sender, EventArgs e)
    {
        delete();
    }
}

}

谢谢

考虑到排序 :您需要实现IComparer才能对列表视图进行排序。 例如:

class ListViewItemComparer : IComparer
{
    private int col;
    public ListViewItemComparer()
    {
        col = 0;
    }
    public ListViewItemComparer(int column)
    {
        col = column;
    }
    public int Compare(object x, object y)
    {
        int returnVal = -1;
        returnVal = String.Compare(((ListViewItem)x).SubItems[col].Text,
        ((ListViewItem)y).SubItems[col].Text);
        return returnVal;
    }
}

来源: https : //msdn.microsoft.com/en-us/library/ms996467.aspx

您可以按以下方式实现它:

    private void btnSort_Click(object sender, EventArgs e)
    {
        listView1.ListViewItemSorter = new ListViewItemComparer(2); // Column number 3
        listView1.Sorting = SortOrder.Ascending;
        listView1.Sort();            
    }

关于获取数组 我会亲自从项目中创建一个对象并将其放入列表中。 我不知道这是正确的方法。

例如

public class ExampleObject
{
    public string DueDate { get; set; }
    public string Module { get; set; }
    public string Title { get; set; }
}

您可以列出以下内容

    private void btnList_Click(object sender, EventArgs e)
    {
        List<ExampleObject> templist = new List<ExampleObject>();

        var collection = listView1.Items;
        foreach (var item in collection)
        {
            ListViewItem obj = (ListViewItem)item;
            var subitems = obj.SubItems;
            List<string> stringlist = new List<string>();

            foreach (ListViewSubItem subitem in subitems)
            {
                stringlist.Add(subitem.Text);
            }

            ExampleObject tempobject = new ExampleObject()
            {
                DueDate = stringlist[0],
                Module = stringlist[1],
                Title = stringlist[2]

            };
            templist.Add(tempobject);

        }
    }

但是您总是可以只使用stringList并将其放在列表中。

// edit:排序顺序应按要求升序。 下降了

这里有几件事情要考虑:1)使用数据库。 这样,数据将更安全,更易于访问,可以保存大量记录等。您可以使用无服务器数据库引擎(例如SQLite 2),如果您真的想避免使用数据库,请使用一些类来存储数据,以便稍后进行序列化将其转换为XML,然后从XML反序列化。 3)如果其他所有操作都失败,则可以将数据存储到本地csv文件中。 :)

这是序列化的一个示例,该序列在表单关闭时将数据写入应用程序文件夹(在data.xml文件中),并在表单加载时从文件加载(非常简单,但是可以给您一个想法...)。

using System.Xml.Serialization;

(...)

 public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void Form1_Load(object sender, EventArgs e)
            {
                listView1.View = View.Details;
                listView1.FullRowSelect = true;

            LoadDataFromDisk();

                listView1.Columns.Add("Due Date", 150);
                listView1.Columns.Add("Module", 150);
                listView1.Columns.Add("Title", 150);
            }

            private void add(string DueDate, String Module, String Title)
            {
                string[] row = { DueDate, Module, Title };
                ListViewItem item = new ListViewItem(row);

                listView1.Items.Add(item);
            }

            private void listView1_MouseClick(object sender, MouseEventArgs e)
            {
                String Duedate = listView1.SelectedItems[0].SubItems[0].Text;
                String Module = listView1.SelectedItems[0].SubItems[1].Text;
                String Title = listView1.SelectedItems[0].SubItems[2].Text;

                textBox1.Text = Duedate;
                textBox2.Text = Module;
                textBox3.Text = Title;
            }

            private void btnAdd_Click(object sender, EventArgs e)
            {
                add(textBox1.Text, textBox2.Text, textBox3.Text);

                textBox1.Text = "";
                textBox2.Text = "";
                textBox3.Text = "";
            }

            private void btnClear_Click(object sender, EventArgs e)
            {
                listView1.Items.Clear();

                textBox1.Text = "";
                textBox2.Text = "";
                textBox3.Text = "";
            }

            private void update()
            {
                listView1.SelectedItems[0].SubItems[0].Text = textBox1.Text;
                listView1.SelectedItems[0].SubItems[1].Text = textBox2.Text;
                listView1.SelectedItems[0].SubItems[2].Text = textBox3.Text;

                textBox1.Text = "";
                textBox2.Text = "";
                textBox3.Text = "";
            }

            private void btnUpdate_Click(object sender, EventArgs e)
            {
                update();
            }

            private void delete()
            {
                if (MessageBox.Show("Are you sure you want to Delete", "Delete", MessageBoxButtons.OKCancel, MessageBoxIcon.Warning) == DialogResult.OK)
                {
                    listView1.Items.RemoveAt(listView1.SelectedIndices[0]);

                    textBox1.Text = "";
                    textBox2.Text = "";
                    textBox3.Text = "";
                }
            }

            private void btnDelete_Click(object sender, EventArgs e)
            {
                delete();
            }

        private void Form1_FormClosing(object sender, FormClosingEventArgs e)
        {
            SaveDataToDisk();
        }

        private void SaveDataToDisk()
        {
            List<MyData> myDataList = new List<MyData>();

            foreach (ListViewItem lvi in this.listView1.Items)
            {
                MyData d = new MyData();

                d.DueDate = lvi.SubItems[0].Text;
                d.Module = lvi.SubItems[1].Text;
                d.Title = lvi.SubItems[2].Text;

                myDataList.Add(d);
            }

            XmlSerializer serializer = new XmlSerializer(myDataList.GetType());
            string dataFile = Path.Combine(Application.StartupPath, "data.xml");
            TextWriter fileStream = new StreamWriter(dataFile);
            serializer.Serialize(fileStream, myDataList);
            fileStream.Close();
        }

        private void LoadDataFromDisk()
        {
            string dataFile = Path.Combine(Application.StartupPath, "data.xml");
            FileStream fileStream = new FileStream(dataFile, FileMode.Open, FileAccess.Read, FileShare.Read);

            List<MyData> data = new List<MyData>();
            XmlSerializer serializer = new XmlSerializer(data.GetType());

            data = (List<MyData>)serializer.Deserialize(fileStream);

            fileStream.Close();

            listView1.Items.Clear();
            foreach (var d in data)
            {
                add(d.DueDate, d.Module, d.Title);
            }
        }
    }

    public class MyData
    {
        public string  DueDate { get; set; }
        public string Title { get; set; }
        public string Module { get; set; }
    }

如果您要坚持程序的信息,则已将信息保存在文件或数据库中。

正如我所看到的,您想在本地保存您的信息:因此有很多机会。

我建议您实现一个状态类,在该状态类中,当您关闭程序并将信息写入文件时,可以保存信息。 要将此类保存为File,必须使其可序列化。( Walktrough

例如:

[Serializable()]
public class State
    {
        public List<ListViewDataItem> ListViewChoises;
    }

如何打开:

 if (File.Exists(FileName))
{
    Stream TestFileStream = File.OpenRead(FileName);
    BinaryFormatter deserializer = new BinaryFormatter();
    var loaded_state = (State)deserializer.Deserialize(TestFileStream);
    TestFileStream.Close();
}

在窗口关闭时填充State类并将其保存在文件中,干预onclose事件:

  protected override void OnFormClosing(FormClosingEventArgs e)
    {
    State state = new State(){Listbox1Choise = (ListboxChoises)System.Enum.Parse(typeof(ListboxChoises),  listView1.SelectedItems[0].SubItems[0].Text);

    Stream TestFileStream = File.Create(FileName);
    BinaryFormatter serializer = new BinaryFormatter();
    serializer.Serialize(TestFileStream, state);
    TestFileStream.Close();    

    base.OnFormClosing(e);               
    }

对于订购,您可以随时调用Linq .OrderBy()或创建自己的订购函数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM