【问题标题】:Save datagridview data and recover from xml file#保存datagridview数据并从xml文件中恢复#
【发布时间】:2014-10-10 08:49:43
【问题描述】:

我有一个应用程序,我将数据从具有 3 列的 datagridView 保存到 xml 文件,该应用程序具有保存和加载按钮,当按下保存时,它会保存到 xml 文件问题是它不加载在datagridview... 只加载它的标题。

DATAGRIDVIEW COLUMNS : (column 1= text, column 2 =checkbox, column 3 = dropdown 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();  
}

【问题讨论】:

  • Dictionary 拥有Keys 集合。对于每个键,您必须在 DataGridView 中创建一行,然后填充行 Cells。有什么问题?
  • 我不知道如何处理...
  • 属性不是用来存储这类数据的。而是将数据保存在 xml 文件中,并在需要时加载它
  • @thangadurai 愿意分享我将如何处理这个问题
  • 你用来绑定的数据源是什么?它是 DataSet,如果是,那么您可以使用 DataSet.WriteXml(filename) 方法创建 xml 文件。使用 DataSet.ReadXml(filename) 方法将其读入 DataSet

标签: c# winforms


【解决方案1】:

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

【讨论】:

  • 是我保存时在 xml 文件中得到的全部内容
  • 您的意思是您尝试调用 `DataSet.WriteXml' 并且它不输出当前数据?
  • yes....当我打开 xml 文件 是我得到的全部内容... DATAGRIDVIEW COLUMNS : (column 1= text, column 2 =checkbox, column 3 = dropdown ) 必须保存所有这些列的值
  • with dataRow[i] = dr.Cells[i];在 for 循环中返回类型和位置....我要尝试 dr.Cells[i].value 看看我得到了什么....
  • 试试dr.Cells[i].value
【解决方案2】:

您的第一个错误是选择ListDictionary 作为数据持有者。其次,将数据序列化string的数组。

你可以有一个小型的presenter类来保存你的数据(或使用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 格式保存数据(便于查看/编辑)。存储设置列表的方法仍然相同:将它们作为列表获取,序列化(或者如果它们只是其他配置设置的一部分,则分配给属性并序列化整个配置)。

【讨论】:

  • DATAGRIDVIEW COLUMNS :(第 1 列 = 文本,第 2 列 = 复选框,第 3 列 = 下拉列表)注意:下拉列表有两个值.....我会使用数组列表
  • 永远不要使用数组列表!
  • 查看了另一种保存到代码发布的 xml 文件的方法.. 看看大家添加的评论
  • 请查看我对问题所做的编辑。现在保存到一个 xml 文件中。但它只是保存标题而不是 datagridview 中的内容...帮助 mybe?
猜你喜欢
  • 1970-01-01
  • 2012-03-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多