[英]c# Save DataGridView to Xml file
這是我保存文件的按鈕:
private void metroButton12_Click(object sender, EventArgs e) // save
{
DataSet ds = (DataSet)dataGridView1.DataSource;
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "XML|*.xml";
if (sfd.ShowDialog() == DialogResult.OK)
{
try
{
ds.Tables[0].WriteXml(sfd.FileName);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
我嘗試將我的datagridview保護為XML,但是當我選擇文件時沒有任何好處。 當我啟動控制台時,我看到:System.NullReferenceException:對象引用未設置為對象實例。
我的gridview看起來像:ID名稱1 Michale 2 Noob
我在這里做錯了什么?我在網上看到很多東西但在stackoverflow和其他論壇中找不到任何解決方案。 請耐心等待新手們。 謝謝!
對我而言,你的問題聽起來並不像你認為的那樣。
當我啟動控制台時,我看到:System.NullReferenceException:對象引用未設置為對象實例。
對我來說,暗示您在啟動應用程序時收到消息,而不是在您單擊按鈕時收到消息。 如果您在單擊之前收到錯誤,則問題出在其他地方,而不是在您發布的代碼段中。 這是您目前正在做的完整且可測試的片段。
using System;
using System.Data;
using System.Windows.Forms;
namespace DataGridViewToXML_43053387
{
public partial class Form1 : Form
{
//DataSet theDataSet;
public Form1()
{
InitializeComponent();
InsertDgvIntoForm();
ExportDgvToXML();
}
private void InsertDgvIntoForm()
{
//create a data set
DataSet ds = new DataSet();
//create a data table for the data set
DataTable dt = new DataTable();
//create some columns for the datatable
DataColumn dc = new DataColumn("ItemName");
DataColumn dc2 = new DataColumn("ItemValue");
DataColumn dc3 = new DataColumn("Blah");
DataColumn dc4 = new DataColumn("Bleh");
//add the columns to the datatable
dt.Columns.Add(dc);
dt.Columns.Add(dc2);
dt.Columns.Add(dc3);
dt.Columns.Add(dc4);
//create 5 rows of irrelevant information
for (int i = 0; i < 5; i++)
{
DataRow dr = dt.NewRow();
dr["ItemName"] = "Item" + i + "Name";
dr["ItemValue"] = "Item" + i + "Value";
dr["Blah"] = "Item" + i + "Blah";
dr["Bleh"] = "Item" + i + "Bleh";
dt.Rows.Add(dr);
}
//add the datatable to the datasource
ds.Tables.Add(dt);
//just because it looks better on my screen
dataGridView1.AutoSize = true;
//make this data the datasource of our gridview
dataGridView1.DataSource = ds.Tables[0];
}
private void ExportDgvToXML()
{
DataTable dt = (DataTable)dataGridView1.DataSource;
SaveFileDialog sfd = new SaveFileDialog();
sfd.Filter = "XML|*.xml";
if (sfd.ShowDialog() == DialogResult.OK)
{
try
{
dt.WriteXml(sfd.FileName);
}
catch (Exception ex)
{
Console.WriteLine(ex);
}
}
}
}
}
blaze_125回答沒有幫助我所以我找到了這個解決方案:
private void btnXML_Save_Click(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.TableName = "Bank";
for (int i = 0; i < dataGridView1.Columns.Count; i++)
{
//if (dataGridView1.Columns[i].Visible) // Add's only Visible columns (if you need it)
//{
string headerText = dataGridView1.Columns[i].HeaderText;
headerText = Regex.Replace(headerText, "[-/, ]", "_");
DataColumn column = new DataColumn(headerText);
dt.Columns.Add(column);
//}
}
foreach (DataGridViewRow DataGVRow in dataGridView1.Rows)
{
DataRow dataRow = dt.NewRow();
// Add's only the columns that you want
dataRow["BLZ"] = DataGVRow.Cells["BLZ"].Value;
dataRow["Test_1"] = DataGVRow.Cells["Test 1"].Value;
dataRow["Test_2"] = DataGVRow.Cells["Test-2"].Value;
dataRow["PIN_TAN_Test_URL"] = DataGVRow.Cells["PIN/TAN-Test URL"].Value;
dt.Rows.Add(dataRow); //dt.Columns.Add();
}
DataSet ds = new DataSet();
ds.Tables.Add(dt);
//Finally the save part:
XmlTextWriter xmlSave = new XmlTextWriter(XML_Save_Path_Filename, Encoding.UTF8);
xmlSave.Formatting = Formatting.Indented;
ds.DataSetName = "Data";
ds.WriteXml(xmlSave);
xmlSave.Close();
}
結果將如下所示:
<Data>
<Bank>
<BLZ>10000001</BLZ>
<Test_1>server.bank.com</Test_1>
<Test_2>V3.0</Test_2>
<PIN_TAN_Test_URL>https://test.bank.com/</PIN_TAN_Test_URL>
</Bank>
....
<Bank>
<BLZ>12396123</BLZ>
<HBCI_Zugang_DNS>test01.test.com</HBCI_Zugang_DNS>
<HBCI_Version>V3.0</HBCI_Version>
<PIN_TAN_Test_URL>https://test11.test.com</PIN_TAN_Test_URL>
</Bank>
</Data>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.