2009-10-29 3 views
3

Si vous êtes familiarisé avec les contrôles Graphiques d'ASP.NET, l'objet Graphique contient un certain nombre d'objets Série, qui sont des séries de points de données pouvant être représentés. Chaque série peut être visualisée d'une manière différente (barre ou point ou ligne) sur le même graphique.Contrôle de graphiques ASP.NET - Ajout et suppression dynamiques de séries de points de données

J'ai un contrôle personnalisé que j'utilise pour créer et supprimer et modifier des listes de séries dans une interface utilisateur. En cliquant sur un bouton, le graphique est créé en utilisant ces séries. Si j'essaie de ré-afficher le graphique, cependant (même avec des séries identiques) il explose et lance une exception NullReferenceException.

Voici le code correspondant - J'ai une série d'emballage d'objets (parce que j'ai quelques propriétés personnalisées là-dedans)

public class DataSeries 
{ 
    private Series _series = new Series(); 
    ... (bunch of other properties) 
    public Series Series 
    { 
     get { return _series; } 
     set { _series = value; } 
    } 
} 

Dans le contrôle lui-même, je stocke une liste de ceux-ci comme une propriété (I seulement créer l'objet pendant les non-postbacks parce que je veux la liste de persister):

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>(); 
     } 
    } 

Puis j'ai quelques amalgame de contrôles que je peux utiliser pour ajouter de nouveaux DataSeries, les supprimer et modifier leurs propriétés. Tout ça fonctionne

Quand ils cliquent sur « Créer un graphique » sur la page, c'est le code qui est exécuté:

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); 
     } 
    } 

La première fois que j'exécute ce morceau de code, cela fonctionne comme un charme. La deuxième fois que je clique sur le bouton qui exécute «refreshChart», j'obtiens une exception NullReferenceException car la valeur de «s.Series.Points» est null. Et je ne peux pas créer un nouvel objet du type que la propriété Points est - son constructeur est privé ou protégé.

Si je ne manipule pas la propriété Points entre les appels suivants de cette fonction, pourquoi devient-elle nulle?

Il y a peut-être quelques solutions auxquelles je pourrais penser - faire que DataSeries hérite des séries au lieu d'en avoir une - alors je pourrais probablement créer une nouvelle propriété Points si l'erreur persiste. Je pourrais également copier profondément le ListOfSeries et voir si cela résout mon problème. Je pourrais aussi peut-être mettre tous mes attributs personnalisés dans l'objet Series - il a une propriété customfields (ou quelque chose de similaire). Si je ne passe pas autour d'un objet en enveloppant un autre, cela pourrait éliminer le problème.

Des idées pour lesquelles cela pourrait se produire et comment cela pourrait être résolu?

Répondre

5

Je ne suis pas sûr à 100%, mais je pense que la ligne

chart.Series.Clear(); 

efface directement l'Series interne de votre membre statique seriesList parce que la ligne

chart.Series.Add(s.Series); 

passe juste une référence à ce Series à la carte.

Je pense que cela n'est pas supposé se produire: vous remplissez probablement (et effacez) ce membre vous-même ailleurs.

Vous pouvez vérifier cette hypothèse en enlevant le getter:

set { seriesList = value; } 

A ce moment le code devrait lancer une exception à

chart.Series.Clear(); 

lorsque vous actualisez: le tableau ne peut pas effacer votre Series plus dans votre membre statique seriesList plus.

Y a-t-il une raison pour laquelle vous utilisez un membre static?

Offrir une copie profonde de la série via votre membre statique et en passant cela au graphique fonctionnerait, sinon pour this answer, et le fait que malheureusement Series n'est pas marqué comme [Serializable].

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

Bonne chance!

Questions connexes