ASP.NET图表控件 - 动态添加和删除一系列数据点

时间:2009-10-29 14:31:55

标签: c# asp.net data-binding charts

如果您熟悉ASP.NET的图表控件,则Chart对象包含许多Series对象 - 这些对象是可以绘制图表的一系列数据点。每个系列都可以在同一图表上以不同的方式(条形或点或线)显示。

我有一个自定义控件,用于在UI中创建,删除和修改Series列表。单击按钮后,将使用这些系列创建图表。但是,如果我尝试重新显示图表(即使是相同的系列),它会爆炸并抛出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属性所属类型的新对象 - 其构造函数是私有的或受保护的。

如果我没有在此函数的后续调用之间操作Points属性,为什么它变为null?

我可以想到一些解决方案 - 让DataSeries继承系列而不是一个 - 如果错误仍然存​​在,我可能会新建Points属性。我也可以深入复制ListOfSeries,看看是否能解决我的问题。我也可以将所有自定义属性推送到Series对象中 - 它具有customfields属性(或类似名称的东西)。如果我没有绕过另一个包裹另一个的对象,那可能会消除这个问题。

为什么会出现这种情况以及如何解决这个问题?

1 个答案:

答案 0 :(得分:5)

我不是百分百肯定,但我怀疑这条线

chart.Series.Clear();

直接清除静态成员Series的内部seriesList 因为这行

chart.Series.Add(s.Series);

只是将对Series的引用传递给图表。

我认为这不应该发生:你可能在其他地方填写(并清除)该成员。

你可以通过删除getter来检查这个假设:

set { seriesList = value; }

此时代码应该在

处抛出异常
chart.Series.Clear();

刷新时:不允许图表清除静态成员Series中的seriesList

您是否有使用静态成员的原因?

通过您的静态成员提供系列的深层副本并将其传递给图表(如果不是this answer),并且遗憾的是Series未标记为[Serializable] ]

// Do you want to write this Property? copying all fields of Series Manually?
chart.Series.Add(s.DeepCopyOfMySeries); 

祝你好运!