如果您熟悉 ASP.NET 的图表控件,Chart 对象包含许多 Series 对象 - 它们是可以绘制图表的一系列数据点。每个系列都可以在同一张图表上以不同的方式(条形、点或线)可视化。
我有一个自定义控件,用于在 UI 中创建、删除和修改系列列表。单击按钮后,将使用这些系列创建图表。但是,如果我尝试重新显示图表(即使是相同的系列),它也会爆炸并抛出 NullReferenceException。
这是相关代码——我有一个对象包装系列(因为我有一些自定义属性)
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”的值为 null。而且我无法创建 Points 属性类型的新对象 - 它的构造函数是私有(private)的或 protected 。
如果我没有在该函数的后续调用之间操作 Points 属性,为什么它会变为 null?
我可能会想到一些解决方案 - 让 DataSeries 继承系列而不是拥有系列 - 然后如果错误仍然存在,我可能可以新建 Points 属性。我还可以深入复制 ListOfSeries,看看是否能解决我的问题。我也许还可以将我所有的自定义属性都推到 Series 对象中——它有一个 customfields 属性(或类似名称的东西)。如果我不传递包裹另一个对象的对象,则可能会消除该问题。
知道为什么会发生这种情况以及如何解决它吗?
最佳答案
我不是 100% 确定,但我怀疑这条线
chart.Series.Clear();
直接清除静态成员 seriesList
的内部 Series
因为这条线
chart.Series.Add(s.Series);
只是将对该 Series
的引用传递给图表。
我认为这不应该发生:您可能在其他地方自己填写(并清除)该成员。
您可以通过删除 getter 来检查这个假设:
set { seriesList = value; }
在那一刻代码应该抛出异常
chart.Series.Clear();
刷新时:图表不再允许清除静态成员 seriesList
中的 Series
。
您使用static 成员有什么原因吗?
如果不是 this answer,通过您的静态成员提供系列的深拷贝并将其传递给图表是可行的,而且不幸的是 Series
没有被标记为 [Serializable]。
// Do you want to write this Property? copying all fields of Series Manually?
chart.Series.Add(s.DeepCopyOfMySeries);
祝你好运!
关于c# - ASP.NET 图表控件 - 动态添加和删除一系列数据点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1644150/