将LINQ结果绑定到DataGrid



我有要绑定到DataGrid的Linq结果,所以我可以编辑结果。请告诉我我做错了什么。以下是我的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"。我在这里做错了什么?请告知。

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

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

您可以选择:

  1. 使用linq语句中的select来创建一个匿名类型,并在执行过程中适当地命名这些值
  2. 在本地创建一个私有类,使用您希望的头文件名
  3. 走老派路线,使用DataTable。这些至少在以下方面很有用:您可以通过编程设置列标题名称,以及其他"功能"的长列表
  4. 在数据绑定控件的标记中手动设置列名,覆盖ItemDataBound事件,并自己处理放置正确的数据。请参阅BoundField和DataGrid.ItemDataBound的页面

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

从代码的外观来看;似乎您正在基于LINQ查询将XmlElement集合绑定到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};

然后填写您认为合适的选定部分。

我相信您看到的问题是,在将查询结果绑定到控件之前,您已经枚举了查询结果。

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

一旦执行了该语句,我确信transactionList对其他任何事情都不可用,除非再次执行查询。

另一种尝试是通过对查询调用ToList((,将transactionList查询结果转换为列表。

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

最新更新