none
c# редактирование xml из datagridview RRS feed

  • Вопрос

  • Всем доброго времени суток! Такая проблема: надо загрузить xml документ и редактировать его в dataGrid... Как это сделать?Буду рад любым рекомендациям, заранее спасибо!
    16 июля 2015 г. 11:12

Ответы

  •   dataGridView1.DataSource = Continuity.Tables["Objects"];

    Данная строчка предполагает что в таблицах есть таблица с названием "Objects". (В моём случае у меня в XML файле было несколько таблиц и я 100%% Был уверен что там таблица с таким названием есть. И такой подход не есть хорошо ) 

    В вашем случае т.к. нужно грузить произвольный XML к таблице стоит обращаться не по имени а по индексу. Предварительно уточнив сколько всего таблиц загружено в ДатаСет.

    Continuity.ReadXml(path, XmlReadMode.ReadSchema);
    А тут предполагается что загружаемый файл имеет табличную схему. Чего вполне может и не быть. Попробуйте заменить XmlReadMode.ReadSchema на  XmlReadMode.InferSchema или XmlReadMode.Auto

    Не знаю как оно у вас там в итоге должно выглядеть... Но я бы наверное после загрузки из файла опросил Дата сет на кол-во таблиц и их названия и забил бы их в ЛистБокс или что-то аналогичное и предложил бы пользователю выбирать. А таблицу грузил бы уже по событию выбора пользователем одного из вариантов (если они, варианты, есть)




    17 июля 2015 г. 21:03

Все ответы

  • Добрый день.

    Создайте объектную модель соответствующую файлу XML. Загрузите в нее файл. Подсуньте свойство с коллекцией в DataGrid. По окончании редактирования сохраните объектную модель назад в XML.

    16 июля 2015 г. 12:23
    Отвечающий
  •  DataSet Continuity = new DataSet("continuity");
            private void loadTab(string path)
            {
                Continuity.Clear();
                Continuity.Tables.Clear();
    
                try
                {
                    Continuity.ReadXml(path, XmlReadMode.ReadSchema);
                    TabDataRedactor.DataSource = Continuity.Tables["Objects"];
                    TabDataRedactor.Update();
                }
                catch (Exception ex) 
                {
                    MessageBox.Show(ex.Message, "Ошибка", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

    При редактировании значений в dataGridView они автоматом будут редактироваться в DataSet'e.

    Сохранить в файл можно в одну строчку: 

    Continuity.WriteXml(filepath, XmlWriteMode.WriteSchema);



    • Изменено DOOMovoj 16 июля 2015 г. 12:46
    • Предложено в качестве ответа DOOMovoj 16 июля 2015 г. 14:06
    16 июля 2015 г. 12:44
  • Привет, спасибо за совет. Все сделал, как ты сказал, но ничего не выводится. 

    Вот кусок кода: 

    private void button1_Click(object sender, EventArgs e)
            {
                DataSet Continuity = new DataSet("continuity");
                string path = @"C:\123\test.xml";
                Continuity.Clear();
                Continuity.Tables.Clear();
                try
                {
                    Continuity.ReadXml(path, XmlReadMode.ReadSchema);
                    dataGridView1.DataSource = Continuity.Tables["Objects"];
                    dataGridView1.Update();
                }
                catch(Exception ex)
                {
                    MessageBox.Show(ex.Message, "FAIL", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }

            }

    Я правильно понял, что в твоем контексте 

    TabDataRedactor = dataGridView1  в моем?

    Подскажи, что не так

    17 июля 2015 г. 7:38
  • Покажите ваш XML файл...
    17 июля 2015 г. 8:13
    Отвечающий
  • В браузере отображается без ошибок. Я вот думаю, а бд не надо создавать, куда файл записывать?

    <?xml version="1.0" encoding="utf-8"?>
    <purchaseOrder orderDate="1900-01-01" xmlns="http://tempuri.org/po.xsd">
      <shipTo country="US">
        <name>name1</name>
        <street>street1</street>
        <city>city1</city>
        <state>state1</state>
        <zip>1</zip>
      </shipTo>
      <billTo country="US">
        <name>name1</name>
        <street>street1</street>
        <city>city1</city>
        <state>state1</state>
        <zip>1</zip>
      </billTo>
      <comment>comment1</comment>
      <items>
        <item partNum="partNum1">
          <productName>productName1</productName>
          <quantity>1</quantity>
          <USPrice>1</USPrice>
          <comment>comment1</comment>
          <shipDate>1900-01-01</shipDate>
        </item>
        <item partNum="partNum2">
          <productName>productName2</productName>
          <quantity>99</quantity>
          <USPrice>-79228162514264337593543950335</USPrice>
          <comment>comment2</comment>
          <shipDate>0001-01-01</shipDate>
        </item>
        <item partNum="partNum3">
          <productName>productName3</productName>
          <quantity>2</quantity>
          <USPrice>79228162514264337593543950335</USPrice>
          <comment>comment3</comment>
          <shipDate>9999-12-31</shipDate>
        </item>
      </items>
    </purchaseOrder>

    17 июля 2015 г. 8:19
  • Ах да, загружать нужно произвольный XML.
    17 июля 2015 г. 8:42
  •   dataGridView1.DataSource = Continuity.Tables["Objects"];

    Данная строчка предполагает что в таблицах есть таблица с названием "Objects". (В моём случае у меня в XML файле было несколько таблиц и я 100%% Был уверен что там таблица с таким названием есть. И такой подход не есть хорошо ) 

    В вашем случае т.к. нужно грузить произвольный XML к таблице стоит обращаться не по имени а по индексу. Предварительно уточнив сколько всего таблиц загружено в ДатаСет.

    Continuity.ReadXml(path, XmlReadMode.ReadSchema);
    А тут предполагается что загружаемый файл имеет табличную схему. Чего вполне может и не быть. Попробуйте заменить XmlReadMode.ReadSchema на  XmlReadMode.InferSchema или XmlReadMode.Auto

    Не знаю как оно у вас там в итоге должно выглядеть... Но я бы наверное после загрузки из файла опросил Дата сет на кол-во таблиц и их названия и забил бы их в ЛистБокс или что-то аналогичное и предложил бы пользователю выбирать. А таблицу грузил бы уже по событию выбора пользователем одного из вариантов (если они, варианты, есть)




    17 июля 2015 г. 21:03