[英]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.