我是c#的新手,我在将其分配给查询后尝试访问IList时遇到问题。这是我的代码:
System.Collections.IList Invoices =
(from p in entities.InvoiceCards
where (p.CustomerCard.ID == CustomerID)
select new
{
InvoiceID = p.ID,
InvoiceDatetime = p.DateTime,
InvoiceTotal = (decimal) p.InvoiceTotal,
}).ToList();
// update the grid
invoiceCardDataGridView.DataSource = Invoices;
-----------这里编译器抱怨对象c?如何在不再执行查询的情况下访问IList中的对象?我需要使用IList作为数据源。什么是更好的方式?请包含代码
foreach (var c in Invoices)
InvoiceTotal += (decimal)c.InvoiceTotal;
答案 0 :(得分:1)
您在查询中使用匿名类型的问题。 因此,当您获得此匿名类型的IList并分配给数据源时,默认情况下您将丢失其类型。
如果要从代码的另一部分的DataSource中检索它,则必须使用适当的类型进行转换。由于匿名类型是由编译器生成的,因此无法对其进行强制转换。
解决方案是创建包含类型的类(如果不存在)。
public class InvoicePart
{
public int InvoiceID {get; set}
public DateTime InvoiceDatetime {get; set}
public decimal InvoiceTotal {get; set}
}
现在,您可以修改查询以获取类型化列表
List<InvoicePart> Invoices =
(from p in entities.InvoiceCards
where (p.CustomerCard.ID == CustomerID)
select new InvoicePart
{
InvoiceID = p.ID,
InvoiceDatetime = p.DateTime,
InvoiceTotal = (decimal) p.InvoiceTotal,
}).ToList();
// update the grid
invoiceCardDataGridView.DataSource = Invoices;
当您获得数据时,您将把它投射到列表
List<InvoicePart> Invoices = (List<InvoicePart>)invoiceCardDataGridView.DataSource;
foreach (InvoicePart c in Invoices)
{
invoiceTotal += c.InvoiceTotal;
}
答案 1 :(得分:0)
如果列表包含匿名类型,并且foreach
循环使用的是另一种方法而不是第一个代码块,则不能以这种方式使用它。
请查看this post可能对您的案件有所帮助。
答案 2 :(得分:0)
如果您绝对必须使用IList
,那么您最好定义显式类型而不是使用匿名类型。然后,当您需要使用它们时,您必须将IList
的元素强制转换为显式类型。
答案 3 :(得分:0)
Zied有正确的想法来解决这个问题。但请注意,绑定到List<T>
不是双向的(对列表的更改不会反映在网格中)。为此,您需要使用BindingSource:
List<InvoicePart> Invoices =
(from p in entities.InvoiceCards
where (p.CustomerCard.ID == CustomerID)
select ...
// update the grid
var bs = new BindingSource();
bs.DataSource = Invoices;
invoiceCardDataGridView.DataSource = bs;