2015-10-08 32 views
0

我正在创建一个生成数据点热图的窗体应用程序。我使用了一个名为“Pipes”的自定义结构列表,其中包含自己的数据点列表。然后我重复我的列表清单,如下所示:将列表绑定到图表控件列表

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

虽然这个工作,它似乎是非常低效率。如果我可以更新列表并更新图表,而不必清除它并对其进行重新绘制(或手动删除已删除的数据等),它也会很好。我熟悉BindingList结构,这是一个正确的工具,如果是这样,你如何将列表中的列表绑定到图表? (因为我真的在数据存储在下层列表中的列表中)。也许我完全使用错误的结构? (尽管列表清单实际上匹配数据生成的相当好)。

+0

你使用哪种图表类型?这将有助于更好地了解问题,看看结果如何。 – TaW

+0

现在我只是使用点图,但我需要花一些时间来确定哪种风格最适合热图。一旦我回到我的电脑,我可以张贴当前外观的屏幕截图。 – Ian

+0

你解决了你的问题吗? – TaW

回答

2

假设你想创建一个Heatmap它看起来像我的例子herehere恐怕使用Chart控制用于此目的可能不是最好的选择。

虽然不是不可能用Charttype Point创建它,它就会有几个问题..

  • 最值得注意的是事实,你将不得不在地图上的每个点创建单独DataPoints

  • 这些都是相当昂贵的

  • 他们不会与图表调整。您可以通过将Series.MarkerSize设置为合适的像素数来设置它们的大小,但在调整大小时必须进行调整。这
  • 一个进一步的限制是标记都是正方形,所以这将是努力创造一个无缝图表..

你问DataBinding,使整个事情更加有效。

您正在使用的DataPoints名单列表,但:

  • DataBinding只有结合值的图表,而不是现成的DataPoints
  • 值甚至列出有其limitations

使用非表格数据源(如列表或数组)时,您可以仅绑定Y值,而不考虑类型的数据绑定方法使用了 。这是因为无法为X值和其他图表属性(如工具提示)指定列。

如果您的X值不重要,这可能不是一个大问题。

嗯,有many ways使用DataBindingChart,无论是在Chart并在Series水平。

而且甚至有一个Points.DataBind重载looks,就好像它是合适的结合颜色是支持扩展属性:

Points.DataBind

同上,再加上:

支持绑定扩展图表属性,如工具提示。

所以结合到DataView

DataTable DT = new DataTable("data"); 

DT.Columns.Add("xField", typeof(int)); 
DT.Columns.Add("yFields", typeof(int)); 
DT.Columns.Add("tipp", typeof(string)); 
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; 

应该像这样工作:但是

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

,而LabelsToolTips确实得到约束,DataPoint.Color不会:

enter image description here

这是令人失望的;毕竟DataPoint.Colorbindable属性。但它被忽略。

Here是支持的属性的列表:

这些属性的列表如下:一个AxisLabel,工具提示,标签, 的LegendText,LegendTooltip和CustomPropertyName(一个 自定义属性的名称)。

结论:据我所知DataBinding让你设置有色DataPoints。要使用Chart控件使代码更有效,您可以简单地尝试使用chart1.SuspendLayoutchart1.ResumeLayout以使设置完全一致。

但是我会首先考虑不使用Chart控件。

两个例子我在第一段给的链接显示两种可选方法:

  • 第一个是所有关于GDI +绘制热图。这非常简单而且非常有效。 (这篇文章中的细节与你的问题没有关系。)对于简单的缩放,我建议绘制一个Bitmap,你将其分配给PanelPictureBox;在ClientSize中创建它并将Panel.ImageLayout(或PictureBox.SizeMode)设置为Stretch

  • 第二个示例使用热图中的大'像素'作为DataGridViewCells ...

查看方法的第二个链接,创建一个不错的List<Color>