Если вы знакомы с элементами управления Charting в ASP.NET, объект Chart содержит несколько объектов 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 между последующими вызовами этой функции, почему оно становится нулевым?
Возможно, есть несколько решений, о которых я мог бы подумать - заставить DataSeries наследовать ряды вместо одного - тогда, скорее всего, я мог бы создать свойство Points, если ошибка все еще будет сохраняться. Я мог бы также глубоко скопировать ListOfSeries и посмотреть, решит ли это мою проблему. Возможно, я мог бы также вставить все свои пользовательские атрибуты в объект Series - у него есть свойство customfields (или что-то с таким же именем). Если я не передам объект, обертывающий другой объект, это может устранить проблему.
Есть идеи, почему это может происходить и как это можно решить?