保存datagridview数据并从xml文件#中恢复
本文关键字:文件 恢复 xml datagridview 数据 保存 | 更新日期: 2023-09-27 18:26:05
我有一个应用程序,我将数据从一个有3列的datagridView保存到xml文件中。该应用程序有保存和加载按钮,当按下保存按钮时,它会保存到xml文件中。问题是它不加载在datagridView中所做的更改。。。只加载它的标题。
DATAGRIDWIEW列:(第1列=文本,第2列=复选框,第3列=下拉列表w)注意:下拉列表有两个值。。。所以它明显的0和1
保存代码:
public void Save(DataGridView dgv)
{
DataTable dt = new DataTable();
for (int i = 1; i < dgv.Columns.Count + 1; i++)
{
DataColumn column = new DataColumn(dgv.Columns[i - 1].HeaderText);
dt.Columns.Add(column);
}
int ColumnCount = dgv.Columns.Count;
foreach (DataGridViewRow dr in dgv.Rows)
{
DataRow dataRow = dt.NewRow();
for (int i = 0; i < ColumnCount; i++)
{
dataRow[i] = dr.Cells[i];
}
}
DataSet ds = new DataSet();
ds.Tables.Add(dt);
XmlTextWriter newXml = new XmlTextWriter(@"c:/older/DGVXML.xml", Encoding.UTF8);
ds.WriteXmlSchema(newXml);
}
到目前为止,这就是我的全部负载:
public void Load(DataGridView dgv)
{
XmlReader xmlFile = XmlReader.Create(@"c:/older/DGVXML.xml", new XmlReaderSettings());
DataSet dataSet = new DataSet();
dataSet.ReadXml(xmlFile,XmlReadMode.ReadSchema);
//LOADS!!! YAY, but only the headers with no data... check save?
dgv.DataSource = dataSet.Tables[0];
xmlFile.Close();
}
问题1
您必须调用dt.Rows.Add(dataRow)
才能添加行。
http://msdn.microsoft.com/en-us/library/5ycd1034.aspx
问题2
DataSet.WriteXmlSchema
方法不输出当前数据,只输出结构。
http://msdn.microsoft.com/en-us/library/kas5y1ky(v=vs.110).aspx
请改用DataSet.WriteXml
方法。
http://msdn.microsoft.com/en-us/library/ws09ehyc(v=vs.110).aspx
使用的代码如下。。对其进行了更改(由提问者编辑)
DataTable dt = new DataTable();
for (int i = 1; i < dgv.Columns.Count + 1; i++)
{
DataColumn column = new DataColumn(dgv.Columns[i - 1].HeaderText);
dt.Columns.Add(column);
}
int columnCount = dgv.Columns.Count;
foreach (DataGridViewRow dr in dgv.Rows)
{
DataRow dataRow = dt.NewRow();
for (int i = 0; i < columnCount; i++)
{
//returns checkboxes and dropdowns as string with .value..... nearly got it
dataRow[i] = dr.Cells[i].Value;
}
dt.Rows.Add(dataRow);
}
DataSet ds = new DataSet();
ds.Tables.Add(dt);
XmlTextWriter xmlSave = new XmlTextWriter(@"c:/older/DGVXML.xml", Encoding.UTF8);
ds.WriteXml(xmlSave);
xmlSave.Close();
您的第一个错误是选择ListDictionary
作为数据的持有者。其次,将数据序列化为string
的数组。
您可以有一个小型的演示者类来保存数据(或者使用Tuple
)。
public class MyParameter
{
public string Name {get; set;}
public bool Enabled {get; set;} // notice type
public SomeType Direction {get; set;} // not sure in type
}
然后,您可以轻松地将行序列化为列表或数组
var list = dgv.Rows.Select(o => new MyParameter()
{
Name = o.Cells["name"],
Enabled = o.Cells["ENABLED"],
Direction = o.Cells["DIRECTION"]
}).ToList();
恢复数据看起来就像一样简单
foreach(var parameter in app.Properties.Settings.Default.DeviceSettings)
{
dvg.Rows.Add(parameter.Name, parameter.Enabled, parameter.Direction);
}
代码可能不会编译(从头开始),但应该给出一个想法。
我忘了提一下,我从来没有用Properties
来存储应用程序设置(只是因为它们是垃圾)。我相信,您能够在其中存储Dictionary
,那么我的实现应该也能正常工作。
保存配置(配置是一组应用程序属性)的更好方法是使用XmlSerializer
以xml
格式保存数据(这对查看/编辑非常友好)。存储设置列表的方法仍然相同:将它们作为列表获取,序列化(或者,如果它们只是其他配置设置的一部分,则分配给属性并序列化整个配置)。