我在IE 8上使用Silverlight 4.我为SharePoint 2010创建了一个新的Silverlight Web部件,用于读取2种外部内容类型。一个代表来自Code Plex的Chinook数据库中的发票,另一个代表每张发票的行。我试图使用Telerik Rad GridView控件在Master-Detail布局中显示代码。我已经用几种不同的方式尝试了这段代码。这是一般性描述: 我有2个对象InvoiceHeader和InvoiceLine。
Invoice标头包含InvoiceLines列表
public List<InvoiceLine> lines { get; set; }
我能够让这个“工作”的唯一方法是使用foreach并循环遍历returnedInvoices,然后使用子foreach(var invoice in returnedInvoices)
并将每行添加到列表中,然后将列表添加到使用invoice.lines.Add(new InvoiceLine(line));
当然问题是我无法使用lines.Clear()
清除行,或者在所有InvoiceHeader对象中清除了所有行。由于我无法清除列表,因此每张发票都将以下发票行添加到其自己的行中。所以我创建了一个InvoiceHeaders的跟踪数组,并尝试使用它来执行tracking[x].lines.Add(new InvoiceLine(line));
然后我收到了我的主题中的错误。尝试将InvoiceLine添加到InvoiceHeader对象的List时,对象引用未设置为对象的实例。我不是真正的开发人员,所以我很感激你能给我的任何帮助。目前代码变得疯狂,所以我为此道歉。我在下面包含了succeededCallback:
void succeededCallback(object sender, ClientRequestSucceededEventArgs e)
{
this.Dispatcher.BeginInvoke(() =>
{
invoices.Clear();
invoiceLines.Clear();
int x = 0;
int y = 0;
foreach (var inv in returnedInvoices)
{
x++;
}
InvoiceHeader[] tracker = new InvoiceHeader[x];
foreach (var invoice in returnedInvoices)
{
tracker[y] = new InvoiceHeader(invoice);
//Get the lines that correspond to this invoice.
foreach (var line in returnedLines)
{
if(line.FieldValues["InvoiceId"].ToString() == invoice.FieldValues["InvoiceId"].ToString())
{
//tracker[y].lines.Add(new InvoiceLine(line));
/*
* If I comment out the line above
* I do not get the error, but I also
* don't get my detail level.
*/
}
}
invoices.Add(tracker[y]);
if (y < x) { y++; }
}
radGridView1234.ItemsSource = invoices;
}
);
}
答案 0 :(得分:1)
您何时初始化lines
?通常,集合属性在用作autoproperty时只有一个带私有setter的getter。
public List<InvoiceLine> lines { get; private set; }
您必须初始化它,因为您当前正在调用空值.Add
。
lines = new List<InvoiceLIne>();
答案 1 :(得分:0)
我在代码示例中看不到对lines
的引用,我无法真正遵循,但此异常意味着您有一个空引用。像行声明这样的自动属性具有该类型的默认值的初始值,对于List,它意味着null,因此繁荣。
不建议直接通过属性公开列表,因为您获得的行为很少与您的预期相符,我建议您将其重构为封装私有和初始化字段的非autoprop,即:
// private field for your data
private List<InvoiceLine> _lines = new List<InvoiceLine>();
// public prop to expose it - but I'd be better still if I just exposed an Add method.
public List<InvoiceLine> Lines
{
get { return this._lines; }
}
但是对于这个问题,最简单的方法就是在尝试添加它之前的某个时刻设置lines = new List<InvoiceLine>();
- 在首选项的构造函数中。