保存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();  
}

保存datagridview数据并从xml文件#中恢复

问题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,那么我的实现应该也能正常工作。

保存配置(配置是一组应用程序属性)的更好方法是使用XmlSerializerxml格式保存数据(这对查看/编辑非常友好)。存储设置列表的方法仍然相同:将它们作为列表获取,序列化(或者,如果它们只是其他配置设置的一部分,则分配给属性并序列化整个配置)。