将列表绑定到图表控件

时间:2015-10-08 22:35:16

标签: c# .net winforms charts

我正在使用一个生成数据点热图的Windows窗体应用程序。我正在使用一个名为“管道”的自定义结构列表,其中包含自己的数据点列表。然后我遍历我的列表列表,如下所示:

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

虽然这种方法有效但看起来非常低效。如果我可以更新我的列表列表并更新图表,而不是必须清除它并重新绘制它(或手动删除删除的数据等),这将是很好的。我熟悉BindingList结构,这是正确使用的工具,如果是这样,如何将列表中的列表绑定到图表? (因为我真的在存储在较低层列表的列表中的数据之后)。也许我完全使用了错误的结构? (尽管列表列表实际上与数据的生成方式相当匹配)。

1 个答案:

答案 0 :(得分:2)

假设您要创建Heatmap,其外观类似于我的示例herehere,我担心为此目的使用Chart控件可能不是最好的选择。

虽然使用Charttype Point创建它并非不可能,但它会有几个问题。

  • 最值得注意的是,您必须为地图中的每个点创建单独的DataPoints

  • 这些相当昂贵

  • 他们不会使用图表调整大小。您可以通过将Series.MarkerSize设置为合适的像素数来设置其大小,但在调整大小时必须进行调整。
  • 另一个限制是标记都是正方形,因此很难创建无间隙图表。

您已询问DataBinding以提高整体效率。

您使用的是DataPoints列表,但是:

  • DataBinding仅将值绑定到图表,而不是现成的DataPoints
  • 即使是值列表也有limitations
  

使用非表格数据源(如列表或数组)时,可以   无论数据绑定方法的类型如何,仅绑定Y值   用过的。这是因为无法为X值指定列   其他图表属性,例如Tooltip。

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

嗯,DataBinding Chart Chart Series 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"); 都有many ways

甚至还有一个Points.DataBind重载looks,好像它适合绑定Colors一样,因为它支持扩展属性:

  

Points.DataBind

     

与上述相同,加上:

     

支持对工具提示等扩展图表属性进行绑定。

所以绑定到Labels

ToolTips

应该像这样工作:

DataPoint.Color

但是,虽然bindableDataBinding确实受到约束,但DataPoints却没有:

enter image description here

这令人失望;毕竟DataPoint.ColorChart属性。但它被忽略了。

Here是受支持的属性列表:

  

这些属性的列表如下:AxisLabel,Tooltip,Label,   LegendText,LegendTooltip和CustomPropertyName(一个名字   自定义属性)。

结论:Afaik chart1.SuspendLayout让您设置彩色 chart1.ResumeLayout。要使用Bitmap控件提高代码效率,您只需尝试使用PanelPictureBox即可完成设置。

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

我在第一段中给出的两个例子的链接显示了两种不同的方式:

  • 第一个是关于在GDI +中绘制热图。这非常简单而且效率很高。 (帖子中的详细信息可能与您的问题无关。)对于简单缩放,我建议您绘制ClientSize,并将其分配给Panel.ImageLayoutPictureBox.SizeMode;在Stretch中创建它,并将Cells(或DataGridView)设置为List<Color>

  • 第二个示例使用WHERE o70vm_invoices_items.invoice_id = $invoiceID GROUP BY o70vm_invoices_items.invoice_id 的{​​{1}}作为热图的大'像素'...

请参阅第二个链接,了解创建好invoice_id的方法!