colanlog Ответов: 2

Как экспортировать данные таблицы в XML


Привет я пытаюсь сохранить datagridview в XML файл с помощью XDocument но проблема в том что когда я нажимаю кнопку Экспорт datagridview становится ясным а экспортированный XML файл пуст

Эта кнопка заполняет datagridview из нескольких текстовых блоков :

private void add_Click(object sender, EventArgs e)
     {
         int n = dataGridView1.Rows.Add();
    
         dataGridView1.Rows[n].Cells[0].Value = txtOne.Text;
         dataGridView1.Rows[n].Cells[1].Value = txtTwo.Text;
         dataGridView1.Rows[n].Cells[2].Value = txtThree.Text; 
     }


Это то что я ищу в виде экспортированного XML файла:

<root>
 <table>
 <one>125</one>
 <two>125</two>
   <child>
     <three>987</three> 
   </child>
 </table>
 </root>


Что я уже пробовал:

private void Export_Click(object sender, EventArgs e)
    {
       
    const string FILENAME = @"c:\temp\test.xml";
    XDocument doc = new XDocument(
    new XDeclaration("1.0", "ISO-8859-1", null),
    new XElement("root",    
        dt.AsEnumerable().Select(row => new XElement("child", new object[]{
                new XElement("one",row[0]),
                new XElement("two",row[1]),
                new XElement("child",new XElement("three", row[2])),
                }));
    
    
    dataGridView1.DataSource = dt;
    doc.Save(FILENAME);
    SaveFileDialog saveFileDialog1 = new SaveFileDialog();
    saveFileDialog1.InitialDirectory = Convert.ToString(Environment.SpecialFolder.MyDocuments);
    saveFileDialog1.Filter = "File Name |*.xml";
    saveFileDialog1.FilterIndex = 1;
    if (saveFileDialog1.ShowDialog() == DialogResult.OK)
    {
        doc.Save(saveFileDialog1.FileName);
    }

2 Ответов

Рейтинг:
5

Maciej Los

Прежде всего, вы никогда не будете хорошим программистом, если вы пытаетесь использовать кусок кода путем копирования-вставки и без изменения кода самостоятельно.

Во-вторых, ваш элемент управления DataGridView привязан к источнику данных none, потому что вы добавляете строки напрямую!

private void add_Click(object sender, EventArgs e)
{
         int n = dataGridView1.Rows.Add();
         //ignored lines!
}

Видеть: Создать свободный элемент управления datagridview в Windows формах | Майкрософт документы[^]

В-третьих, ваша xml-структура неверна! Вместо:
<root>
 <table>
 <one>125</one>
 <two>125</two>
   <child>
     <three>987</three> 
   </child>
 </table>
 </root>

это должно быть что-то вроде:
<root>
   <table>
     <row>
       <one>125</one>
       <two>128</two>
       <child>
         <three>987</three> 
       </child>
     </row>
     <row>
       <one>321</one>
       <two>216</two>
       <child>
         <three>999</three> 
       </child>
     </row>
   </table>
 </root>



Таким образом, если вы хотите экспортировать несвязанные данные в xml-файл, вы должны выполнить цикл через коллекция DataGridViewRows[^].

private void Export_Click(object sender, EventArgs e)
{
    const string FILENAME = @"c:\temp\test.xml";
    XDocument doc = new XDocument(new XDeclaration("1.0", "ISO-8859-1", "yes"));
    XElement root = new XElement("root");
    XElement tbl = new XElement("table");
    List<XElement> entries = DataGridView1.Rows.Cast<DataGridViewRow>()
	.Select(row => new XElement("row", new XElement[]
		{
			new XElement("one", row.Cells[0].Value.ToString()),
			new XElement("two", row.Cells[1].Value.ToString()),
			new XElement("child", new XElement("three", row.Cells[2].Value.ToString()))
		}))
		.ToList();
    tbl.Add(entries);
    root.Add(tbl);
    doc.Add(root);
    doc.Save(FILENAME);
}


Удачи вам!


colanlog

Большое спасибо, приятель. Ты спас меня
Также за советом, это мой первый проект ✌

Maciej Los

Всегда пожалуйста.
Ваше здоровье!
Мацей

Рейтинг:
2

RickZeeland

Хотя привязка данных является рекомендуемым способом, вы можете сделать это, как в примере, взятом из: Экспортируйте DataGridView в XML-файл без какого-либо набора данных или DataTable ...[^]

private DataTable GetDataTableFromDGV(DataGridView dgv) {
    var dt = new DataTable();

    foreach (DataGridViewColumn column in dgv.Columns) {
        if (column.Visible) {
            // You could potentially name the column based on the DGV column name (beware of dupes)
            // or assign a type based on the data type of the data bound to this DGV column.
            dt.Columns.Add();
        }
    }

    object[] cellValues = new object[dgv.Columns.Count];
    foreach (DataGridViewRow row in dgv.Rows) {
        for (int i = 0; i < row.Cells.Count; i++) {
            cellValues[i] = row.Cells[i].Value;
        }
        dt.Rows.Add(cellValues);
    }

    return dt;
}


И чтобы сэкономить:
DataTable dT = GetDataTableFromDGV(DataGridView1);
           DataSet dS = new DataSet();
           dS.Tables.Add(dT);
           dS.WriteXml(File.OpenWrite("xml.xml"));


Набор данных, вероятно, не нужен, просто используйте DataTable.Метода writexml("xml.xml")
Видеть: объект DataTable.Метод WriteXml (System.Data) | Microsoft Docs[^]