phy*_*ler 3 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; }
}
}
Run Code Online (Sandbox Code Playgroud)
在控件本身,我将这些列表存储为属性(我只在非回发期间创建对象,因为我希望列表保持不变):
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>();
}
}
Run Code Online (Sandbox Code Playgroud)
然后我有一些控件的混合,我可以用来添加新的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);
}
}
Run Code Online (Sandbox Code Playgroud)
我第一次执行这段代码时,它就像一个魅力.第二次单击执行'refreshChart'的按钮时,我得到一个NullReferenceException,因为's.Series.Points'的值为null.而且我无法创建Points属性所属类型的新对象 - 其构造函数是私有的或受保护的.
如果我没有在此函数的后续调用之间操作Points属性,为什么它变为null?
可能有一些我能想到的解决方案 - 让DataSeries继承系列而不是一个 - 如果错误仍然存在,我可能会新建Points属性.我也可以深入复制ListOfSeries,看看是否能解决我的问题.我也可以将所有自定义属性推送到Series对象中 - 它具有customfields属性(或类似名称的东西).如果我没有绕过包裹另一个的对象,那可能会消除这个问题.
有什么想法可能会发生以及如何解决?
我不是百分百肯定,但我怀疑这条线
chart.Series.Clear();
Run Code Online (Sandbox Code Playgroud)
直接清除Series静态成员的内部seriesList
因为该行
chart.Series.Add(s.Series);
Run Code Online (Sandbox Code Playgroud)
只是Series将对它的引用传递给图表.
我认为这不应该发生:你可能在其他地方自己填写(并清除)该成员.
你可以通过删除getter来检查这个假设:
set { seriesList = value; }
Run Code Online (Sandbox Code Playgroud)
那时代码应该抛出异常
chart.Series.Clear();
Run Code Online (Sandbox Code Playgroud)
刷新时:不允许图表清除Series静态成员中的图像seriesList.
你有没有理由使用静态成员?
通过静态成员提供系列的深层副本,并将其传递给图表,如果没有这个答案,那么很遗憾,并且不幸的Series是没有标记为[Serializable].
// Do you want to write this Property? copying all fields of Series Manually?
chart.Series.Add(s.DeepCopyOfMySeries);
Run Code Online (Sandbox Code Playgroud)
祝好运!
| 归档时间: |
|
| 查看次数: |
12580 次 |
| 最近记录: |