XML-строка в DataGridView - PullRequest
       12

XML-строка в DataGridView

2 голосов
/ 14 апреля 2010

В настоящее время я работаю с веб-службой, чтобы получить отчет о пользователях в системе удаленной поддержки.

После получения моего отчета и получения результата мне возвращается следующая строка по методу:

<report>
    <header>
        <field id="0">Source</field>
        <field id="1">Session ID</field>
        <field id="2">Date</field>
        <field id="3">Name</field>
        <field id="24">Technician Name</field>
        <field id="25">Technician ID</field>
    </header>
    <data>
        <row>
            <field id="0">Email</field>
            <field id="1">55037806</field>
            <field id="2">4/13/2010 2:28:06 AM</field>
            <field id="3">Bill Gates</field>
            <field id="24">John</field>
            <field id="25">1821852</field>
        </row>
        <row>
            <field id="0">Telephone</field>
            <field id="1">55034548</field>
            <field id="2">4/13/2010 12:59:44 AM</field>
            <field id="3">Steve Jobs</field>
            <field id="24">John</field>
            <field id="25">1821852</field>
        </row>
    </data>
</report>

После получения этой строки мне нужно взять ее и отобразить фактические данные в виде таблицы данных. Я попытался поместить его в XMLDocument, а затем прочел, но, похоже, он не работает. Просто интересует другой набор глаз :) Приложение написано на C # в VS2010.

1 Ответ

2 голосов
/ 14 апреля 2010

Вы можете использовать Linq to XML для создания DataTable с именами столбцов из файла XML, а затем установить эту таблицу как DataSource из DataGridView:

        string xml = theWebService.TheMethod();
        XDocument doc = XDocument.Parse(xml);
        var queryHeaders =
            from field in doc.Root.Element("header").Elements("field")
            select new
            {
                Id = field.Attribute("id").Value,
                Name = field.Value
            };

        var headers = queryHeaders.ToDictionary(f => f.Id, f => f.Name);

        DataTable table = new DataTable();
        foreach (var kvp in headers)
        {
            table.Columns.Add(kvp.Value);
        }

        Func<XElement, DataRow> rowGenerator =
            element =>
            {
                var row = table.NewRow();
                foreach (var field in element.Elements("field"))
                {
                    string fieldId = field.Attribute("id").Value;
                    string columnName = headers[fieldId];
                    string value = field.Value;
                    row[columnName] = value;
                }
                return row;
            };

        var rows =
            from rowElement in doc.Root.Element("data").Elements("row")
            select rowGenerator(rowElement);

        foreach (var row in rows)
        {
            table.Rows.Add(row);
        }

        dataGridView.AutoGenerateColumns = true;
        dataGridView.DataSource = table;

Обратите внимание, что приведенный выше код работает, только если все поля имеют разные имена. Если это не так, вы можете использовать идентификатор поля в качестве имени DataColumn и заменить заголовки DGV фактическими именами полей

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