Reliure de listes de listes au contrôle de graphique

Je travaille sur une application de formulaire Windows qui génère une carte thermique des points de données. J’utilise une liste de structures personnalisées, appelées “Pipes”, contenant leurs propres listes de points de données. Je parcours ensuite ma liste de listes comme indiqué ici:

foreach (NewPipe pipe in wall) { foreach (DataPoint x in pipe.returnPoints(xNum)) { chart1.Series["Series1"].Points.Add(x); } xNum++; } 

Bien que cela fonctionne, cela semble horriblement inefficace. De plus, ce serait bien si je pouvais simplement mettre à jour ma liste de listes et faire mettre le graphique à jour, au lieu de devoir l’effacer et la re-représenter (ou supprimer manuellement les données supprimées, etc.). Je connais bien la structure BindingList, est-ce le bon outil à utiliser et si oui, comment lier une liste dans une liste à un graphique? (Depuis que je suis vraiment après les données stockées dans une liste dans la liste de niveau inférieur). Peut-être que j’utilise les mauvaises structures entièrement? (Bien que les listes de listes correspondent réellement à la manière dont les données sont générées assez bien).

En supposant que vous souhaitiez créer une carte thermique ressemblant à mes exemples ici ou ici, je crains que l’utilisation d’un contrôle de Chart à cette fin ne soit pas le meilleur choix.

Bien qu’il ne soit pas impossible d’utiliser un Charttype Point pour le créer, cela posera plusieurs problèmes.

  • Le plus notable est le fait que vous devrez créer des DataPoints individuels pour chaque sharepoint la carte.

  • Ce sont plutôt chers

  • Ils ne seront pas redimensionnés avec le graphique. Vous pouvez définir leur taille en définissant Series.MarkerSize sur un nombre de pixels approprié, mais vous devrez vous adapter lorsque vous redimensionnerez.
  • Une autre limite à cela est que les marqueurs sont tous des carrés, il sera donc difficile de créer un graphique sans faille.

Vous avez demandé à propos de DataBinding de rendre l’ensemble plus efficace.

Vous utilisez des listes de liste de DataPoints de DataPoints mais:

  • DataBinding lie uniquement les valeurs au graphique, pas les DataPoints prêts à l’ DataPoints
  • Même les listes de valeurs ont leurs limites :

Lorsque vous utilisez des sources de données non tabulaires telles que des listes ou des tableaux, vous pouvez lier uniquement les valeurs Y, quel que soit le type de méthode de liaison de données utilisé. En effet, les colonnes ne peuvent pas être spécifiées pour les valeurs X et d’autres propriétés de graphique, telles que les info-bulles.

Cela peut ne pas être un gros problème si vos X-Values ​​ne sont pas importantes.

Eh bien, il existe de nombreuses façons d’utiliser DataBinding avec un Chart , à la fois au niveau du Chart et au niveau de la Series .

Et il y a même une surcharge Points.DataBind qui semble convenir pour lier les couleurs, car elle prend en charge les propriétés étendues:

Points.DataBind

Comme ci-dessus, plus:

Prend en charge la liaison pour les propriétés de graphique étendues telles que les info-bulles.

Donc, la liaison à un DataView

 DataTable DT = new DataTable("data"); DT.Columns.Add("xField", typeof(int)); DT.Columns.Add("yFields", typeof(int)); DT.Columns.Add("tipp", typeof(ssortingng)); DT.Columns.Add("kolor", typeof(Color)); DataRow row = DT.NewRow(); row["xField"] = 1; row["yFields"] = 1; row["tipp"] = "red"; row["kolor"] = Color.Red; DT.Rows.Add(row); // ...etc... DataView DV = new DataView(DT); chart1.DataSource = DV; 

devrait fonctionner comme ceci:

 someSeries.Points.DataBind(DV, "xField", "yFields", "MarkerColor=kolor,Color=kolor,Tooltip=tipp,Label=tipp"); 

Toutefois, si les Labels et les ToolTipsToolTips sont bien liés, le DataPoint.Color ne:

entrez la description de l'image ici

C’est décevant; Après tout, DataPoint.Color est un atsortingbut bindable lié . Mais il est ignoré.

Voici une liste des propriétés sockets en charge:

Une liste de ces propriétés est la suivante: AxisLabel, Tooltip, Label, LegendText, LegendTooltip et CustomPropertyName (nom d’une propriété personnalisée).

Conclusion : Afaik DataBinding ne vous laissera pas définir de DataPoints colorés . Pour rendre votre code plus efficace à l’aide d’un contrôle Chart , vous pouvez simplement essayer d’utiliser chart1.SuspendLayout et chart1.ResumeLayout pour que la configuration soit chart1.SuspendLayout chart1.ResumeLayout .

Cependant, je préférerais au départ ne pas utiliser de contrôle graphique.

Les liens vers les deux exemples que j’ai cités dans le premier paragraphe montrent deux manières alternatives:

  • Le premier concerne le dessin de la carte thermique dans GDI +. C’est vraiment sortingvial et très efficace. (Les détails de l’article ne sont en principe pas pertinents pour votre problème.) Pour une mise à l’échelle simple, je suggère de dessiner dans un Bitmap , que vous affectez à un Panel ou à un PictureBox ; créez-le dans ClientSize et définissez le Panel.ImageLayout (ou le PictureBox.SizeMode ) sur Stretch .

  • Le deuxième exemple utilise les Cells d’un DataGridView tant que grands «pixels» pour la carte thermique …

Voir le deuxième lien pour une méthode pour créer une belle List !