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

时间:2014-10-10 08:49:43

标签: c# winforms

我有一个应用程序,我将数据从带有3列的datagridView保存到应用程序已保存的xml文件中并加载但是当按下保存时它会保存到xml文件的问题是它不会加载在datagridview ...仅为其加载标题。

DATAGRIDVIEW COLUMNS :(第1列=文本,第2列=复选框,第3列=下拉列表w)注意:下拉列表有两个值...所以它的obvoiusly为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();  
}

2 个答案:

答案 0 :(得分:2)

问题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();

答案 1 :(得分:0)

您首先错误的是选择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格式保存数据(这对于查看/编辑是人性化的) )。存储设置列表的方法仍然相同:将它们作为列表,序列化(或者如果它们只是其他配置设置的一部分,分配给属性并序列化整个配置)。