XML-файл для DataGridView в C # asp.Net - PullRequest
0 голосов
/ 09 декабря 2018

Это XML-файл, который я пытаюсь заполнить DataGridView:

<?xml version="1.0" encoding="utf-8"?>
<Transactions>
<Transaction>
    <Name>David</Name>
    <Amount>123</Amount>
    <Date>11/11/2011</Date>
</Transaction>
<Transaction>
    <Name>Mark</Name>
    <Amount>400</Amount>
    <Date>12/12/2012</Date>
</Transaction>
<Transaction
    ><Name>Norah</Name>
    <Amount>400</Amount>
    <Date>12/12/2012</Date>
</Transaction>
<Transaction>
    <Name>Cecil</Name>
    <Amount>400</Amount>
    <Date>12/12/2012</Date>
</Transaction>

</Transactions>

Это последний код, который я пробовал, но он не работал.
Его C # asp.Нетто (входной массив больше, чем количество столбцов. У меня есть только 3 столбца (имя, сумма и дата)

DataTable dt = new DataTable();
XDocument doc = XDocument.Load(filepath);
foreach (XElement transactions in doc.Descendants().Where(x => x.Name.LocalName == "Transactions")){
    XElement Name = transactions.Descendants("Name").FirstOrDefault();
    XElement Amount = transactions.Descendants("Amount").FirstOrDefault();
    XElement date = transactions.Descendants("Date").FirstOrDefault();                
    dt.Rows.Add(new object[]
    {
        (string)Name.Element("Name"),
        (string)Amount.Element("Amount"),
        (string)date.Element("Date")
    });
}
dataGridView1.DataSource = dt;

Ответы [ 2 ]

0 голосов
/ 21 декабря 2018

Попробуйте этот код

  using System.Xml;

    XmlReader xmlFile = XmlReader.Create(@"C:\Users\Shubham\Documents\Visual Studio 2012\Projects\WindowsFormsApplication1\WindowsFormsApplication1\XMLFile1.xml", new XmlReaderSettings());
            DataSet dataSet = new DataSet();
            //Read xml to dataset
            dataSet.ReadXml(xmlFile);
            //Pass Transaction table to datagridview datasource
            dataGridView1.DataSource = dataSet.Tables["Transaction"];

            //Close xml reader

            xmlFile.Close();
0 голосов
/ 09 декабря 2018

Есть несколько проблем с размещенным кодом.

Во-первых, вновь созданным DataTable dt… никогда не дается никаких столбцов.Поэтому неудивительно, что строка кода ... dt.Rows.Add(… падает и горит.Отсюда и текущая ошибка.Добавление трех строк кода, приведенных ниже, должно решить эту отсутствующую ошибку столбца.

dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Amount", typeof(string));
dt.Columns.Add("Date", typeof(string));

К сожалению, исправление этой проблемы покажет только другую проблему ...

Цикл foreach захватывает XML-элементыНеправильноЯ предполагаю, что есть более простой способ сделать это, используя опубликованный XML-файл и более внимательно рассмотрев приведенный ниже код foreach

foreach (XElement transactions in doc.Descendants().Where(x => x.Name.LocalName == "Transactions")) { … }

Я предполагаю, что вы хотите изменить строку«Транзакции» в «Транзакции» без «s». Если оставить «s» в строке, будет выбран «целый» XML-файл, поскольку «Транзакции» - это корень.Следовательно, код будет нуждаться в дополнительном разъяснении как «какое» «Имя, Сумма или Дата», поскольку их более одного (1).Кроме того, цикл будет выполняться только «один раз», поскольку он захватывает корневой узел.Я рекомендую изменить значение на «Транзакция», чтобы получить то, что вы ищете.

Наконец, код, кажется, слишком усложняет вещи при получении значения XElement.Как обсуждалось выше, теперь мы знаем, что нам нужно изменить переменную цикла XElement на «Транзакция», это будет означать, что каждый «элемент», который мы получаем в цикле, будет выглядеть так: *

<Transaction>
    <Name>David</Name>
    <Amount>123</Amount>
    <Date>11/11/2011</Date>
</Transaction>

Поэтому... если у нас есть XElement с именем transaction, как указано выше, то простое присваивание ...

string Name = Transaction.Element("Name").Value

должно вернуть искомое значение.Кажется ненужным создавать дополнительные XElement переменные (Имя, Сумма и дата).Необходимый XElement уже существует, и он называется «транзакция». Учитывая это, приведенный ниже код должен работать, как и ожидалось.

foreach (XElement transaction in doc.Descendants().Where(x => x.Name.LocalName == "Transaction")) {
      dt.Rows.Add(transaction.Element("Name").Value, transaction.Element("Amount").Value, transaction.Element("Date").Value);
    }

С учетом вышесказанного, код ниже демонстрирует то, что описано выше.

try {
    DataTable dt = new DataTable();
    dt.Columns.Add("Name", typeof(string));
    dt.Columns.Add("Amount", typeof(string));
    dt.Columns.Add("Date", typeof(string));
    XDocument doc = XDocument.Load(filepath);
    foreach (XElement transaction in doc.Descendants().Where(x => x.Name.LocalName == "Transaction")) {
      dt.Rows.Add(transaction.Element("Name").Value, transaction.Element("Amount").Value, transaction.Element("Date").Value);
    }
    dataGridView1.DataSource = dt;
}
catch (Exception ex) {
  MessageBox.Show("Error: " + ex.Message);
}

Следует также отметить, что когда код использует строку ниже…

transaction.Element("NodeName").Value

Если «NodeName» не существует, исключение НЕТ, оно просто вернетноль.Поэтому, если вы видите правильное количество строк, но отсутствуют данные, было бы целесообразно проверить, что возвращается при чтении из XElement.Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...