我有一个应用程序,我将数据从带有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();
}
答案 0 :(得分:2)
您必须致电dt.Rows.Add(dataRow)
添加行。
http://msdn.microsoft.com/en-us/library/5ycd1034.aspx
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
存储在其中,然后我的实现也应该有效。
保存配置(配置是一组应用程序属性)的更好方法是使用XmlSerializer
以xml
格式保存数据(这对于查看/编辑是人性化的) )。存储设置列表的方法仍然相同:将它们作为列表,序列化(或者如果它们只是其他配置设置的一部分,分配给属性并序列化整个配置)。