我有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
“。我在这做错了什么?请指教。
答案 0 :(得分:2)
通常,asp.net控件中的数据绑定通过检查作为数据源提供的对象列表的属性来工作。
在这种情况下,datagrid已设置为自动生成列,这意味着它将根据传递给它的对象的属性自动生成标头。在这里你传递IEnumerable<XElement>
,所以它使用它的属性列表作为绑定列表。
您的选择是:
匿名类型可能是阻力最小的路径。
答案 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};
然后根据需要填写选择部分。