c#将ListView数据存储到数组中并按升序排序
我已经创建了一个windows窗体应用程序,在该应用程序中,我将信息添加到列表视图中,但是我希望在下次打开程序时存储这些信息。如何将列表视图信息存储到数组中,以及如何按升序(截止日期)对其进行排序 }c#将ListView数据存储到数组中并按升序排序,c#,arrays,winforms,sorting,C#,Arrays,Winforms,Sorting,我已经创建了一个windows窗体应用程序,在该应用程序中,我将信息添加到列表视图中,但是我希望在下次打开程序时存储这些信息。如何将列表视图信息存储到数组中,以及如何按升序(截止日期)对其进行排序 } >P> >这里有几点要考虑: 1) 使用数据库。这样数据更安全,更容易访问,可以保存大量记录等。您可以使用无服务器数据库引擎,如SQLite 2) 若您确实希望避免使用数据库,那个么可以使用一些类来存储数据,以便以后可以将其序列化为XML并从XML反序列化。 3) 如果其他所有操作都失败,您可以将
>P> >这里有几点要考虑: 1) 使用数据库。这样数据更安全,更容易访问,可以保存大量记录等。您可以使用无服务器数据库引擎,如SQLite 2) 若您确实希望避免使用数据库,那个么可以使用一些类来存储数据,以便以后可以将其序列化为XML并从XML反序列化。 3) 如果其他所有操作都失败,您可以将数据存储到本地csv文件中。:) 下面是一个序列化示例,它在表单关闭时将数据写入应用程序文件夹(在data.xml文件中),并在表单加载时从文件中加载数据 (非常基本的一个,但它可以给你一个想法…)
使用System.Xml.Serialization;
(...)
公共部分类Form1:Form
{
公共表格1()
{
初始化组件();
}
私有void Form1\u加载(对象发送方、事件参数e)
{
listView1.View=View.Details;
listView1.FullRowSelect=true;
LoadDataFromDisk();
listView1.Columns.Add(“到期日”,150);
listView1.Columns.Add(“模块”,150);
listView1.Columns.Add(“Title”,150);
}
私有无效添加(字符串截止日期、字符串模块、字符串标题)
{
字符串[]行={DueDate,Module,Title};
ListViewItem项目=新建ListViewItem(行);
listView1.Items.Add(项目);
}
private void ListView1u鼠标单击(对象发送方,鼠标目标)
{
字符串Duedate=listView1.SelectedItems[0]。子项[0]。文本;
字符串模块=listView1。SelectedItems[0]。子项[1]。文本;
字符串标题=listView1。SelectedItems[0]。子项[2]。文本;
textBox1.Text=Duedate;
textBox2.Text=模块;
textBox3.Text=标题;
}
私有void btnAdd_单击(对象发送者,事件参数e)
{
添加(textBox1.Text、textBox2.Text、textBox3.Text);
textBox1.Text=“”;
textBox2.Text=“”;
textBox3.Text=“”;
}
私有void btnClear\u单击(对象发送者,事件参数e)
{
listView1.Items.Clear();
textBox1.Text=“”;
textBox2.Text=“”;
textBox3.Text=“”;
}
私有void更新()
{
listView1.SelectedItems[0]。子项[0]。Text=textBox1.Text;
listView1.SelectedItems[0]。子项[1]。Text=textBox2.Text;
listView1.SelectedItems[0]。子项[2]。Text=textBox3.Text;
textBox1.Text=“”;
textBox2.Text=“”;
textBox3.Text=“”;
}
私有void b更新\单击(对象发送者,事件参数e)
{
更新();
}
私有void delete()
{
if(MessageBox.Show(“是否确实要删除”,“删除”,MessageBoxButtons.OK取消,MessageBoxIcon.Warning)=DialogResult.OK)
{
listView1.Items.RemoveAt(listView1.SelectedDices[0]);
textBox1.Text=“”;
textBox2.Text=“”;
textBox3.Text=“”;
}
}
私有void btnDelete\u单击(对象发送者,事件参数e)
{
删除();
}
私有作废Form1\u FormClosing(对象发送方,FormClosingEventArgs e)
{
SaveDataToDisk();
}
私有void SaveDataToDisk()
{
List myDataList=新列表();
foreach(此.listView1.Items中的ListViewItem lvi)
{
MyData d=新的MyData();
d、 DueDate=lvi.SubItems[0]。文本;
d、 Module=lvi.SubItems[1]。文本;
d、 Title=lvi.SubItems[2]。文本;
myDataList.Add(d);
}
XmlSerializer serializer=新的XmlSerializer(myDataList.GetType());
字符串dataFile=Path.Combine(Application.StartupPath,“data.xml”);
TextWriter fileStream=新的StreamWriter(数据文件);
serializer.Serialize(fileStream,myDataList);
fileStream.Close();
}
私有void LoadDataFromDisk()
{
字符串dataFile=Path.Combine(Application.StartupPath,“data.xml”);
FileStream FileStream=新FileStream(数据文件,FileMode.Open,FileAccess.Read,FileShare.Read);
列表数据=新列表();
XmlSerializer serializer=新的XmlSerializer(data.GetType());
数据=(列表)序列化程序。反序列化(文件流);
fileStream.Close();
listView1.Items.Clear();
foreach(数据中的var d)
{
添加(d.截止日期、d.模块、d.标题);
}
}
}
公共类MyData
{
公共字符串DueDate{get;set;}
公共字符串标题{get;set;}
公共字符串模块{get;set;}
}
这里有几点要考虑:
1) 使用数据库。这样数据更安全,更容易访问,可以保存大量记录等。您可以使用无服务器数据库引擎,如SQLite
2) 若您确实希望避免使用数据库,那个么可以使用一些类来存储数据,以便以后可以将其序列化为XML并从XML反序列化。
3) 如果其他所有操作都失败,您可以将数据存储到本地csv文件中。:)
下面是一个序列化示例,其中
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();
}
}
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; }
}
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;
}
}
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);
}
}
[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();
}
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);
}