如果您熟悉ASP.NET的图表控件,那么Chart对象包含多个Series对象 - 这些是可以绘制成图表的数据点系列。每个系列可以以不同的方式(条形、点或线)在同一张图表上可视化。
我有一个自定义控件,用于在UI中创建、删除和修改Series列表。单击按钮后,使用这些Series创建图表。但是,如果尝试重新显示图表(即使具有相同的Series),它会崩溃并抛出NullReferenceException异常。
以下是相关代码 - 我有一个包装Series的对象(因为其中有一些自定义属性)。
在控件本身中,我将这些列表存储为属性(我只在非回发期间创建对象,因为我希望列表持久存在):
第一次执行代码时,它能够完美地运行。第二次点击执行“refreshChart”的按钮时,我会得到一个NullReferenceException,因为“s.Series.Points”的值为空。而且,我无法创建该Points属性类型的新对象——它的构造函数是私有或受保护的。
如果在这个函数的后续调用之间没有操作Points属性,为什么它会变成null呢?
也许有几种解决方案——使DataSeries继承series而不是拥有一个,然后如果错误仍然存在,可能可以新建Points属性。我也可以深度复制ListOfSeries,看看是否可以解决我的问题。我也可以将所有自定义属性推入Series对象中——它有一个customfields属性(或类似命名的属性)。如果我不传递包装另一个对象的对象,那可能会消除这个问题。
有什么想法为什么会发生这种情况,以及如何解决?
我有一个自定义控件,用于在UI中创建、删除和修改Series列表。单击按钮后,使用这些Series创建图表。但是,如果尝试重新显示图表(即使具有相同的Series),它会崩溃并抛出NullReferenceException异常。
以下是相关代码 - 我有一个包装Series的对象(因为其中有一些自定义属性)。
public class DataSeries
{
private Series _series = new Series();
... (bunch of other properties)
public Series Series
{
get { return _series; }
set { _series = value; }
}
}
在控件本身中,我将这些列表存储为属性(我只在非回发期间创建对象,因为我希望列表持久存在):
private static List<DataSeries> seriesList;
public List<DataSeries> ListOfSeries
{
get { return seriesList; }
set { seriesList = value; }
}
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
seriesList = new List<DataSeries>();
}
}
然后我有一些控件,可以用来添加新的DataSeries、删除它们并修改其属性。这些都可以正常工作。
当用户在页面上点击“创建图表”按钮时,会执行以下代码:
protected void refreshChart(object sender, EventArgs e)
{
chart.Series.Clear();
foreach (DataSeries s in seriesControl.ListOfSeries)
{
string propertyName = s.YAxisProperty;
//List of data to display for this series
List<Sampled_Data> sampleList = Sample.GetSamplesById(s.ComponentId);
foreach (Sampled_Data dSample in sampleList)
{
//GetPropertyValue returns a float associated with the propertyname
//selected for displaying as the Y Value
s.Series.Points.AddY(BindingLib.GetPropertyValue(dSample, propertyName));
}
chart.Series.Add(s.Series);
}
}
第一次执行代码时,它能够完美地运行。第二次点击执行“refreshChart”的按钮时,我会得到一个NullReferenceException,因为“s.Series.Points”的值为空。而且,我无法创建该Points属性类型的新对象——它的构造函数是私有或受保护的。
如果在这个函数的后续调用之间没有操作Points属性,为什么它会变成null呢?
也许有几种解决方案——使DataSeries继承series而不是拥有一个,然后如果错误仍然存在,可能可以新建Points属性。我也可以深度复制ListOfSeries,看看是否可以解决我的问题。我也可以将所有自定义属性推入Series对象中——它有一个customfields属性(或类似命名的属性)。如果我不传递包装另一个对象的对象,那可能会消除这个问题。
有什么想法为什么会发生这种情况,以及如何解决?