我有1个表单,其中 button1 在 datagridview 中绘制表格。 填充单元格后,我需要通过 button2 将数据从 datagridview 保存到xml。
//save
private void button1_Click(object sender, EventArgs e)
{
try
{
DataSet ds = new DataSet();
ds = (DataSet)(dataGridView1.DataSource);
ds.WriteXml(@"c:\1.xml");
}
catch (Exception ex)
{
MessageBox.Show("Ошибка: " + ex.Message);
}
}
//draw a datagridview
private void button2_Click(object sender, EventArgs e)
{
try
{
int x, y;
x = Convert.ToInt32(textBox1.Text);
y = Convert.ToInt32(textBox2.Text);
double[,] grid;
grid = new double[x, y];
int k = 0;
k = dataGridView1.ColumnCount;
if (k != 0)
for (int i = 0; i < k; i++)
dataGridView1.Columns.RemoveAt(0);
dataGridView1.Columns.Clear();
AddColumns(y, dataGridView1);
AddRows(x, dataGridView1);
dataGridView1.RowHeadersWidth = 22;
}
catch (Exception ex)
{
MessageBox.Show("Ошибка: " + ex.Message);
}
}
但我收到了错误:
对象引用未设置为对象的瞬时。
那么,如何将datagridview保存到xml?
答案 0 :(得分:2)
我希望你的dgv没有有效的数据源。有关如何绑定数据源的信息,请参阅here。您是如何使用数据填充dgv的?
您可以尝试序列化,但DataGridView不可序列化,您需要遍历dgv(datagridview)并将每个项目添加到集合中。最好创建一个可以重复dgv数据的结构,并将其声明为[Serializable()]
。每个字段都可以存储为字符串,因此只需遍历dgv,在每个项目上调用ToString()
并将其添加到结构的实例中。遍历你的dgv行:
for (int i = 0; i < dgv.Rows.Count; i++)
{
//add each row and item to your structure
}
或者,如果您有数据源,则可以更直接地序列化。
所以现在你有一个可序列化的集合,它充满了你的所有数据。现在您需要序列化该结构,然后将其写入文件,如:
XmlSerializer izer = new XmlSerializer(YourStructure.GetType());
TextWriter WriteFileStream = new StreamWriter(@"c:\1.xml");
izer.Serialize(WriteFileStream, YourStructure);
WriteFileStream.Close();
我希望这有帮助,可以找到有关序列化的信息here。请记住,您可以通过双击设计视图中的按钮为按钮OnClick事件创建处理程序。