Привязать результат LINQ к DataGrid - PullRequest
0 голосов
/ 05 июля 2011

У меня есть результаты Linq, которые я хочу связать с DataGrid, поэтому я могу редактировать результаты. Посоветуйте пожалуйста что я делаю не так. Ниже мой C# код:

            var root = XElement.Parse(xmlText);
            var elementsThatCanBeEmpty = new HashSet<XName>
            {
                XName.Get("Login"),
                XName.Get("CustomerStreet2"),
                XName.Get("PayeeStreet2"),
                XName.Get("PayAsName"),
                XName.Get("PayeeAccount")
            };

            var transactionList =
                from transactions in root.Elements(XName.Get("Transactions")).Elements().AsEnumerable()
                where transactions.Elements().Any
                    (
                        el =>
                        String.IsNullOrEmpty(el.Value) &&
                        !elementsThatCanBeEmpty.Contains(el.Name)
                    )
                select transactions;

                foreach (var t in transactionList)
                {
                    Response.Write(t.Element(XName.Get("CustomerName")).Value);
                }

                dgBillPay.DataSource = transactionList;
                dgBillPay.DataBind();

Когда я запускаю страницу, DataGrid имеет заголовки «Value, Xml, HasAttributes, HasElements, IsEmpty, Value, BaseUri». Что я здесь не так делаю? Пожалуйста, сообщите.

Ответы [ 3 ]

2 голосов
/ 05 июля 2011

Как правило, привязка данных в элементах управления asp.net работает путем проверки свойств списка объектов, предоставляемых в качестве источника данных.

В этом случае сетка данных была настроена на автоматическую генерацию столбцов, что означает, что она будет автоматически генерировать заголовки на основе свойств объектов, переданных ей.Здесь вы передаете IEnumerable<XElement>, поэтому он использует свой список свойств в качестве списка привязок.

Здесь вы можете:

  1. Использовать select в вашем выражении linq длясоздайте анонимный тип и назовите значения соответствующим образом.
  2. Создайте частный класс локально с именами, которые вы хотите, чтобы заголовки были.
  3. Перейдите в старую школу и используйте DataTable .По крайней мере, они полезны тем, что вы можете задавать имена заголовков столбцов программно, а также длинный список других «функций».
  4. Установите имена столбцов вручную в разметке для элемента управления с привязкой к данным, переопределитеItemDataBound событие и обрабатывать размещение правильных данных самостоятельно.См. Страницы для BoundField и DataGrid.ItemDataBound .

Анонимные типы - это, вероятно, путь наименьшего сопротивления.

0 голосов
/ 05 июля 2011

По виду кода;похоже, что вы привязываете коллекцию XmlElements к вашей DataGrid на основе вашего запроса LINQ.

Я думаю, что вам может понадобиться что-то вроде этого:

        var transactionList =
            from transactions in root.Elements(XName.Get("Transactions")).Elements().AsEnumerable()
            where transactions.Elements().Any
                (
                    el =>
                    String.IsNullOrEmpty(el.Value) &&
                    !elementsThatCanBeEmpty.Contains(el.Name)
                )
            select new { CustomerName = transactions.Element(XName.Get("CustomerName")).Value};

И затем заполните поле выборачасть, как вы считаете нужным.

0 голосов
/ 05 июля 2011

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

foreach (var t in transactionList)
{
    Response.Write(t.Element(XName.Get("CustomerName")).Value);
}

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

Другая вещь, которую нужно попробовать, - преобразовать результаты запроса транзакции в список, вызвав ToList () для запроса.

Tryэти две вещи и посмотрим, что произойдет.

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