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

标签 c# asp.net data-binding charts

如果您熟悉 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/

相关文章:

c# - 序列化 .NET 字典

c# - 如何使用反射实例化对象构造函数中的属性

c# - 1000个用户可以同时阅读单个文本吗?

单击“保存”按钮后的 WPF 数据绑定(bind)

c# - 在 gridview 中单击编辑时在 Jquery 中显示/隐藏 Accordion 面板?

C# 通过下划线分割字符串

asp.net - 如何为facebook开发应用程序?

c# - 由于 Request.Form 中的字符编码,字符串中出现问号

WPF 数据网格组合框数据绑定(bind)

c# - 将命令绑定(bind)到动态创建的按钮