【问题标题】:c# Storing ListView Data into an Array and Sorting in Ascending Orderc# 将ListView数据存入数组并按升序排序
【发布时间】:2016-04-20 12:36:59
【问题描述】:

我创建了一个 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();
    }
}

}

谢谢

【问题讨论】:

  • 嗨。因此,如果我了解您想在本地存储数据而不是数据库,对吗?
  • 你能说出具体的问题吗?例如。 “我不知道该怎么做……”
  • @RicardoRacciore 是的,这就是我想要做的。
  • @Sinatr 我希望能够将列表视图数据存储在一个数组中,这样当我再次打开程序时,数据仍然存在。

标签: c# arrays winforms sorting


【解决方案1】:

关于排序:您需要一个 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 并将其放入列表中。

//编辑:排序顺序应该像请求的那样升序。降序

【讨论】:

    【解决方案2】:

    这里有几件事情需要考虑: 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; }
        }
    

    【讨论】:

      【解决方案3】:

      如果您想保留某个程序的信息,您可以将信息保存在文件或数据库中。

      如我所见,您希望将自己的信息保存在本地:因此提供了很多机会。

      我建议您实现一个状态类,当您关闭程序并将信息写入文件时,您可以在其中保存信息。要将此类保存为 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() 或创建您自己的订购功能。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-08
        • 2013-07-13
        • 1970-01-01
        • 2015-08-30
        • 1970-01-01
        • 2017-05-07
        相关资源
        最近更新 更多