将LINQ结果绑定到DataGrid

时间:2011-07-05 16:59:26

标签: c# asp.net xml linq data-binding

我有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的标题为“ValueXmlHasAttributesHasElementsIsEmptyValueBaseUri“。我在这做错了什么?请指教。

3 个答案:

答案 0 :(得分:2)

通常,asp.net控件中的数据绑定通过检查作为数据源提供的对象列表的属性来工作。

在这种情况下,datagrid已设置为自动生成列,这意味着它将根据传递给它的对象的属性自动生成标头。在这里你传递IEnumerable<XElement>,所以它使用它的属性列表作为绑定列表。

您的选择是:

  1. 使用linq语句中的select创建anonymous type,并随时对值进行适当命名。
  2. 使用您想要标题的名称在本地创建一个私有类。
  3. 去老派并使用DataTable。这些至少是有用的,因为您可以以编程方式设置列标题名称,以及其他“功能”的长列表。
  4. 在数据绑定控件的标记中手动设置列名,覆盖ItemDataBound事件并自行处理正确的数据。请参阅BoundFieldDataGrid.ItemDataBound
  5. 的页面

    匿名类型可能是阻力最小的路径。

答案 1 :(得分:0)

我相信您遇到的问题是因为您在将查询结果绑定到控件之前枚举了查询结果。

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

执行该语句后,我非常确定transactionList对其他任何东西都不可用,除非再次执行查询。

要尝试的另一件事是通过在查询上调用ToList()将transactionList查询结果转换为列表。

尝试这两件事,看看会发生什么。

答案 2 :(得分:0)

从代码的外观;您似乎是根据LINQ查询将XmlElements集合绑定到DataGrid。

我想你可能会想要这样的东西:

        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};

然后根据需要填写选择部分。