Silverlight添加到List <t> throws对象引用未设置为对象的实例</t>

时间:2010-09-21 13:25:15

标签: c# silverlight sharepoint-2010 web-parts

我在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;                        
            }
            );
    }

2 个答案:

答案 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>(); - 在首选项的构造函数中。