Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/117: Рейтинг темы: голосов - 117, средняя оценка - 4.91
3 / 3 / 1
Регистрация: 22.11.2009
Сообщений: 61
1

DataGridView в XML

05.02.2010, 21:31. Показов 22395. Ответов 17
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Помогите пожалуйста с кодом.
Пытаюсь сохранить содержимое dataGridView в XML. В нете нашел чтото вроде этого:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void SaveDocToFileXML(String TR4FileName)
{
     StreamWriter writer = new StreamWriter(TR4FileName);
     XmlSerializer serializer = new XmlSerializer(typeof(DataGrid));
     serializer.Serialize(writer, dataGridView1);
     writer.Close();
}
 
private void toolStripButton2_Click(object sender, EventArgs e)
{
     if (saveFileDialog1.ShowDialog() == DialogResult.OK)
     {
          SaveDocToFileXML(saveFileDialog1.FileName);
     }
Но код не работает. Пишет: Возникла ошибка при отражении типа "System.Windows.Forms.DataGrid"

Это вообще правильный способ? Может есть варианты получше?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.02.2010, 21:31
Ответы с готовыми решениями:

DataGridView и XML
Получаю данные в DataGridView из xml файла... Как в xml файле задать размер столбца для...

Из XML в dataGridView на C#
Доброго времени суток. У меня некоторая проблема с считыванием данных из xml файла. Может, кто...

XML to datagridview
структура<?xml version="1.0" encoding="utf-8"?> <Root> <spr_proc> <proc id="1"> ...

Выгрузка xml в datagridview
Задача выгрузки из xml файла всех таблиц разом в datagridview и дальнейшая запись в БД. Использую...

17
13 / 13 / 2
Регистрация: 01.12.2009
Сообщений: 37
05.02.2010, 22:28 2
Через датасет.Если что вдруг объясню - не так давно сам целый день рыскал.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        private void Form1_Load(object sender, EventArgs e)
        {          
            FileInfo f = new FileInfo(1.xml);
            if (f.Exists)
            {
                dataSet1.ReadXml(1.xml, XmlReadMode.ReadSchema);
                dataGridView1.DataSource = dataSet1.DefaultViewManager;
            }
        }
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            var xmldoc = new XmlDocument();
            xmldoc.InnerXml = dataSet1.GetXml();
            xmldoc.Save(1.xml);
0
3 / 3 / 1
Регистрация: 22.11.2009
Сообщений: 61
06.02.2010, 15:42  [ТС] 3
Цитата Сообщение от g.alex Посмотреть сообщение
Через датасет
Я не использую датасет. Может есть другие способы?
0
13 / 13 / 2
Регистрация: 01.12.2009
Сообщений: 37
06.02.2010, 19:47 4
Если честно не знаю - особенно,если несколько колонок.В датасет нет ничего сложного - а без него слишком много глюков.

Добавлено через 2 часа 22 минуты
1.ложим на форму датасет.Левый клик по контролу
а. в свойствах датасет есть tables(коллекция)
б.добавляем таблицу table1
в.справа есть colunms(коллекция)
г.добавляем column1 и column2
2.ложим на форму датагрид.Левый клик по контролу
а.в свойствах грида есть datasours-связываем с датасет1
б.в свойствах грида есть datamember-связываем с нашей table1
все.
Датасет выступает хранилищем данных и посредником при сериализации в 1.xml, а датагрид его отображением.
0
3 / 3 / 1
Регистрация: 22.11.2009
Сообщений: 61
07.02.2010, 13:01  [ТС] 5
Цитата Сообщение от g.alex Посмотреть сообщение
Если честно не знаю - особенно,если несколько колонок.В датасет нет ничего сложного - а без него слишком много глюков.
Никаких глюков нет. Датасет ненужен впринципе.

Думаю лучшим способом будет "вручную" в цикле забивать данные в XML.
Вопрос теперь один: Как работать с XML?
0
118 / 119 / 20
Регистрация: 21.01.2010
Сообщений: 252
07.02.2010, 13:55 6
Как то сложно все у вас. Если есть dataGridView значит есть и таблица которая и служит источником данных. Записывайте её, потом считывайте.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
private void WriteTable()
        {
            table.WriteXml("exam.xml", XmlWriteMode.WriteSchema);
            dataGridView1.DataSource = null; //это я для наглядности очищаю Таблицу и Сетку
            table.Rows.Clear();  
            table.Columns.Clear();
        }
// ну здесь считываем
private void ReadTable()
        {
            table.ReadXml("exam.xml");
            dataGridView1.DataSource = table;
        }
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
07.02.2010, 14:06 7
Цитата Сообщение от nikitasnv777 Посмотреть сообщение
Я не использую датасет.
а зачем тогда ты вообще используешь datagridview? что ты там показываешь? этот елемент сам по себе не может себя сериализировать. это - задача объекта (-ов), к которому (-ым) он привязан.
0
3 / 3 / 1
Регистрация: 22.11.2009
Сообщений: 61
07.02.2010, 14:30  [ТС] 8
Цитата Сообщение от novi4ok Посмотреть сообщение
а зачем тогда ты вообще используешь datagridview? что ты там показываешь? этот елемент сам по себе не может себя сериализировать. это - задача объекта (-ов), к которому (-ым) он привязан.
для работы с таблицей.

Добавлено через 9 минут
Сделал так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
private void SaveDocToFileXML(String TR4FileName)
{           
    XmlTextWriter writer = null;
    try
    {
        writer = new XmlTextWriter(TR4FileName, System.Text.Encoding.Unicode);
        writer.Formatting=Formatting.Indented;
        writer.WriteStartDocument();
        //Запись данных о версии
        writer.WriteStartElement("DocInfo");
        writer.WriteAttributeString("DocType", "TepRast4Doc");
        writer.WriteAttributeString("Version", "tr4d_r1");
        //Запись данных
        writer.WriteStartElement("Table");
        for(int i=0; i<dataGridView1.RowCount-1; i++)
        {
            writer.WriteStartElement("Row");
            writer.WriteAttributeString("Number", dataGridView1.Rows[i].Cells[0].Value.ToString());
            writer.WriteAttributeString("Name", dataGridView1.Rows[i].Cells[1].Value.ToString());
            writer.WriteAttributeString("ObjectType", dataGridView1.Rows[i].Cells[2].Value.ToString());
            writer.WriteAttributeString("KoefficientObject", dataGridView1.Rows[i].Cells[3].Value.ToString());
            writer.WriteAttributeString("A", dataGridView1.Rows[i].Cells[4].Value.ToString());
            writer.WriteAttributeString("B", dataGridView1.Rows[i].Cells[5].Value.ToString());
            writer.WriteAttributeString("Count", dataGridView1.Rows[i].Cells[6].Value.ToString());
            writer.WriteAttributeString("StoronaSveta", dataGridView1.Rows[i].Cells[7].Value.ToString());
            writer.WriteAttributeString("VnutrC", dataGridView1.Rows[i].Cells[8].Value.ToString());
            writer.WriteAttributeString("VneshC", dataGridView1.Rows[i].Cells[9].Value.ToString());
            writer.WriteAttributeString("M_kv", dataGridView1.Rows[i].Cells[10].Value.ToString());
            writer.WriteAttributeString("VT", dataGridView1.Rows[i].Cells[11].Value.ToString());
            writer.WriteAttributeString("SNadbavkami", dataGridView1.Rows[i].Cells[12].Value.ToString());
            writer.WriteAttributeString("RowType", dataGridView1.Rows[i].Cells[13].Value.ToString());
            writer.WriteEndElement();
        }   
        writer.WriteEndElement();
        writer.WriteEndElement();
        writer.WriteEndDocument();
    }
    catch (Exception ex)
    {
    MessageBox.Show("Ошибка: " + ex.Message);
    }
    finally
    {
    if (writer != null) writer.Close();
    }
}
Замечательно работает
0
556 / 510 / 25
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
07.02.2010, 14:41 9
Цитата Сообщение от nikitasnv777 Посмотреть сообщение
для работы с таблицей.
но "таблицы" при этом, по-видимому, не существует, а только "сырые данные" в datagridview? создай dataset в памяти, привяжи к своему элементу, и сериализируй. сишарф тем и замечателен, что в нем "все есть" (ну, почти), нужно только правильно применить. в принципе ты мог и свой control написать, и xml - поток сам сформатировать, но зачем, если ВСЕ ЭТО УЖЕ ЕСТЬ ?
0
2 / 2 / 0
Регистрация: 13.02.2009
Сообщений: 28
07.04.2010, 12:08 10
Цитата Сообщение от g.alex Посмотреть сообщение
Через датасет.Если что вдруг объясню - не так давно сам целый день рыскал.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        private void Form1_Load(object sender, EventArgs e)
        {          
            FileInfo f = new FileInfo(1.xml);
            if (f.Exists)
            {
                dataSet1.ReadXml(1.xml, XmlReadMode.ReadSchema);
                dataGridView1.DataSource = dataSet1.DefaultViewManager;
            }
        }
        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            var xmldoc = new XmlDocument();
            xmldoc.InnerXml = dataSet1.GetXml();
            xmldoc.Save(1.xml);}

не распознает "FileInfo" и "XmlDocument", пишет не удалось найти такую команду (возможно пропущен using) , что делать?

Добавлено через 25 минут
исправил, нужно подключить IO и Xml
0
1512 / 779 / 103
Регистрация: 22.04.2008
Сообщений: 1,610
07.04.2010, 23:18 11
1. Для работы с XML советую использовать технологию LINQ to XML
2. Если вы используете Объекты DataTable то еще проще выможете сериализовать эти объекты.
Если что то не понятно или не получится пишите.
0
Vanёk
17.05.2010, 17:56 12
Я загружаю данные из XML в dataGridView (с помощью dataSet), но почему-то данные загружаются частично, т.е заполняются только первые 3 столбца (всего их 6!!!). У кого-нибудь было нечто подобное? Как это можно исправить?
407 / 359 / 82
Регистрация: 07.10.2009
Сообщений: 558
17.05.2010, 19:55 13
У кого-нибудь было нечто подобное?
Было!
Как это можно исправить?
1. Сколько DataTable в составе DataSet, столько же сколько Вы предполагали?
2. Сколько столбцов в DataTable, которая связана с Вашим DataGridView, столько же сколько Вы предполагали?
3. Если хотя бы один ответ отрицательный, просмотрите структуру исходного XML-файла.
0
Vanёk
17.05.2010, 21:16 14
В dataGridView 6 столбцов. При загрузке первые три заполняются информацией,а остальные пустые. В Table в свойстве Columns записана коллекция из 6 столбцов. При загрузке использую код

ds.ReadXml(name); // типа DataSet
dataGridView1.DataSource = ds.Tables[0]; //т.к. table всего один, состоящий из 6 столбцов

Структура XML файла не нарушена. Проверяла и через блокнот, и через Explorer. Да и в этой же программе этот же XML файл нормально отображается в listBox и richTextBox
407 / 359 / 82
Регистрация: 07.10.2009
Сообщений: 558
18.05.2010, 10:52 15
В Table в свойстве Columns записана коллекция из 6 столбцов
Т. е. Вы заранее размечаете DataSet в конструкторе?
Попробуйте загрузить данные так:
C#
1
2
3
4
DataSet ds = new DataSet();//создаем новый DataSet
ds.ReadXml(name);//загружаем данные
int countTables = ds.Tables.Count;//кол-во таблиц
int countColumns = ds.Tables[0].Columns.Count;//кол-во столбцов
И все же проверьте величины countTables и countColumns, возможно в DataSet создается не одна таблица с 6-ю колонками, а к примеру, 2-е таблицы по 3 колонки!
1
0 / 0 / 0
Регистрация: 31.07.2015
Сообщений: 25
26.01.2016, 10:05 16
Цитата Сообщение от nikitasnv777 Посмотреть сообщение
Сделал так:
А как подобную запись считать обратно в DGV?
0
3 / 3 / 1
Регистрация: 22.11.2009
Сообщений: 61
27.01.2016, 19:51  [ТС] 17
Цитата Сообщение от CandyBober Посмотреть сообщение
А как подобную запись считать обратно в DGV?
Давно дело было... Раскопал старый исходник. Там так:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
private void OpenDocToFileXML(String TR4FileName) //Открытие файлов
        {
            toolStripStatusLabel2.Text = "";
            int ReadType = 0;
            XmlTextReader reader = null;
            while (dataGridView1.RowCount>0) dataGridView1.Rows.RemoveAt(0);
            try
            {
                reader = new XmlTextReader(TR4FileName);
                reader.WhitespaceHandling = WhitespaceHandling.None; // пропускаем пустые узлы
                while (reader.Read())
                if (reader.NodeType == XmlNodeType.Element)
                {
                    if (reader.Name == "DocInfo")
                    {
                        if ((reader.GetAttribute("DocType")=="TepRast4Doc") && (reader.GetAttribute("Version")=="tr4d_r1")) ReadType=1; 
                    }
                    if (ReadType==1)
                    {
                        while (reader.Read() && reader.Name == "Row")
                        {
                            dataGridView1.Rows.Add(reader.GetAttribute("Number"), reader.GetAttribute("Name"), reader.GetAttribute("ObjectType"), 
                                                   reader.GetAttribute("KoefficientObject"), reader.GetAttribute("A"), reader.GetAttribute("B"), 
                                                   reader.GetAttribute("Count"), reader.GetAttribute("StoronaSveta"), reader.GetAttribute("VnutrC"), 
                                                   reader.GetAttribute("VneshC"), reader.GetAttribute("M_kv"), reader.GetAttribute("VT"), 
                                                   reader.GetAttribute("SNadbavkami"), reader.GetAttribute("RowType"));
                        }
                        toolStripStatusLabel2.Text = Path.GetFileName(TR4FileName).Replace(".tr4d", "");
                    } else
                    {
                        MessageBox.Show("Ошибка: Это не TepRast4 документ");
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show("Ошибка: " + ex.Message);
            }
            finally
            {
                if (reader != null) reader.Close();
            } 
        }
2
0 / 0 / 0
Регистрация: 31.07.2015
Сообщений: 25
29.01.2016, 03:47 18
nikitasnv777, не понимаю почему у меня этот код не срабатывает. Не выдает никакой ошибки, а просто не срабатывает. Пробовал использовать и XmlDataDocument(), результат тот же.
Структура файла xml проста:
XML
1
2
3
4
5
6
7
8
9
10
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
  <General>
    <Data One="первый" Two="второй" />
  </General>
  <Table>
    <Rows Number="1" Name="2" ObjectType="3" />
    <Rows Number="11" Name="22" ObjectType="33" />
    <Rows Number="111" Name="222" ObjectType="333" />
  </Table>
</DocInfo>
0
29.01.2016, 03:47
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.01.2016, 03:47
Помогаю со студенческими работами здесь

TextBox > DataGridView > XML
Подскажите, пожалуйста, как можно ввести значения в DataGridView только с помощью TextBox и кнопки....

DatagridView и XML файл
Добрый день! Подскажите, как работать Datagridview с XML Файлом? Есть DGV (столбцы созданы в...

Загрузка в DataGridView из XML
Пытаюсь загрузить данные из XML файла в datagridview, но в datagridview ничего не отображается....

Вывод XML в DataGridView
Подскажите, пожалуйста. В этом файле хранится 2 товара. Правильно ли я понимаю, что каждый товар...

Сохранение DataGridView в xml
Привет, по видеоуроку сделал прогу, а она не работает. using System; using...

Загрузить Xml в DataGridView
Добрый день ! Подскажите как правильно загрузить xml в таблицу . И в последствии сохранить обратно....


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru