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
Series.MarkerSize
sur un nombre de pixels approprié, mais vous devrez vous adapter lorsque vous redimensionnerez. 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
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 ToolTips
– ToolTips
sont bien liés, le DataPoint.Color
ne:
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
!