ASP.NET Charting Control - динамическое добавление и удаление серии точек данных - PullRequest
3 голосов
/ 29 октября 2009

Если вы знакомы с элементами управления 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 (или что-то с таким же именем). Если я не передам объект, обертывающий другой объект, это может устранить проблему.

Есть идеи, почему это может происходить и как это можно решить?

1 Ответ

5 голосов
/ 02 декабря 2009

Я не уверен на 100%, но подозреваю, что линия

chart.Series.Clear();

напрямую очищает внутренний Series вашего статического члена seriesList потому что линия

chart.Series.Add(s.Series);

просто передает ссылку на этот Series на график.

Я думаю, что это не должно происходить: вы, вероятно, заполняете (и очищаете) этот член сами где-то еще.

Вы можете проверить это предположение, удалив геттер:

set { seriesList = value; }

В этот момент код должен выдать исключение на

chart.Series.Clear();

при обновлении: диаграмме больше не разрешается очищать ваш Series в вашем статическом элементе seriesList.

Есть ли причина, по которой вы используете статический член?

Предложение глубокой копии Серии через статический член и передача ее на диаграмму сработает, если бы не этот ответ , и тот факт, что, к сожалению, Series не помечен как [ Serializable].

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

Удачи!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...