c# - 将 XML 文件加载和保存到 Listview
问题描述
将我的 XML 文件加载到 Listview 时,我遇到了一个小问题。它没有加载所有值,它只加载单个节点。你能告诉我我的循环加载值有什么问题吗?或者有什么建议可以让它更好地工作吗?
有人建议我使用 JSON.net 来更轻松地加载和保存到 listview,但找不到有关它的资源。所以我只是做了xml,因为这只是我在保存和加载文件时所知道的。
这是xml文件:
<?xml version="1.0" encoding="utf-8"?> <Settings> <title><![CDATA[Episode 1]]></title> <duration><![CDATA[59.33]]></duration> <resolution><![CDATA[1280x560]]></resolution> <title><![CDATA[Episode 2]]></title> <duration><![CDATA[01.04.25]]></duration> <resolution><![CDATA[1280x560]]></resolution> </Settings>
private void button1_Click(object sender, EventArgs e)
{
var file = @"C:\Users\MARK\Desktop\__TEST\SAMPLE.xml";
if (File.Exists(file))
{
XmlDocument doc = new XmlDocument();
doc.Load(file);
XmlNodeList topM = doc.SelectNodes("Settings");
LV.BeginUpdate();
foreach (XmlElement element in topM)
{
ListViewItem items = new ListViewItem();
XmlNodeList Title = element.GetElementsByTagName("title");
for (int i = 0; i < Title.Count; i++)
{
items.Text = Title[i].InnerText;
}
XmlNodeList Duration = element.GetElementsByTagName("duration");
for (int i = 0; i < Duration.Count; i++)
{
items.SubItems.Add(Duration[i].InnerText);
}
XmlNodeList Resolution = element.GetElementsByTagName("resolution");
for (int i = 0; i < Resolution.Count; i++)
{
items.SubItems.Add(Resolution[i].InnerText);
}
LV.Items.Add(items);
}
LV.EndUpdate();
}
}
private void button2_Click(object sender, EventArgs e)
{
var file = @"C:\Users\MARK\Desktop\__TEST\SAMPLE.xml";
using (XmlTextWriter xml = new XmlTextWriter(file, Encoding.UTF8))
{
xml.Formatting = System.Xml.Formatting.Indented;
xml.WriteStartDocument();
xml.WriteStartElement("Settings");
foreach (ListViewItem i in LV.Items)
{
xml.WriteStartElement("title");
xml.WriteCData(i.Text.ToString());
xml.WriteEndElement();
xml.WriteStartElement("duration");
xml.WriteCData(i.SubItems[1].Text);
xml.WriteEndElement();
xml.WriteStartElement("resolution");
xml.WriteCData(i.SubItems[2].Text);
xml.WriteEndElement();
}
xml.WriteEndElement();
xml.WriteEndDocument();
}
}
解决方案
经过一个小时的搜索和分析。这是我使用 BinaryFormatter 发现的。
这也可能对其他人有所帮助:)
private void SaveBinary(ListView lv)
{
using (SaveFileDialog sfd = new SaveFileDialog())
{
sfd.Filter = "*.bin|*.bin";
sfd.RestoreDirectory = true;
if (sfd.ShowDialog() == DialogResult.OK)
{
ListViewItem[] items = new ListViewItem[lv.Items.Count];
lv.Items.CopyTo(items, 0);
// Serialize the items and save it to a file.
using (FileStream fs = File.Create(sfd.FileName))
{
BinaryFormatter bf = new BinaryFormatter();
bf.Serialize(fs, items);
}
this.Text = "Data has been saved";
}
}
}
private void LoadBinary(ListView lv)
{
using (OpenFileDialog ofd = new OpenFileDialog())
{
ofd.Filter = "*.bin|*.bin";
ofd.RestoreDirectory = true;
if (ofd.ShowDialog() == DialogResult.OK)
{
ListViewItem[] items = null;
// Deserialize the items from the binary file.
using (FileStream fs = File.OpenRead(ofd.FileName))
{
BinaryFormatter bf = new BinaryFormatter();
items = (ListViewItem[])bf.Deserialize(fs);
}
lv.Items.Clear();
lv.BeginUpdate();
// Load the items into the listView1.Items collection.
lv.Items.AddRange(items);
lv.EndUpdate();
}
this.Text = "Data has been loaded";
}
}
推荐阅读
- javascript - 类别较少时如何在高图中显示所有数据?
- angularjs - 如何将依赖项注入过滤器AngularJS以进行茉莉花测试
- javascript - AnguarJS中的鼠标单击/键盘按下事件
- vue.js - VueJS 如何通过选择不同的单选按钮来触发方法?
- oauth-2.0 - 无法使用邮递员的 Keycloak 执行身份验证请求
- ios - Swift CoreData:使用 NSSortDescriptor 按计算的即将到来的生日排序
- mongodb - 如何从客户端查询本地 MongoDB?
- javascript - CesiumJS - 使用带有广告牌的弹出窗口?
- php - 从数组数组中挑选组合
- tensorflow - 使用 Conv2D 时,kernel_size 何时以及为什么可能是 1 或 2 暗淡?