【问题标题】:Binding list of lists to chart control将列表列表绑定到图表控件
【发布时间】:2016-01-06 17:46:44
【问题描述】:

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

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

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

【问题讨论】:

  • 您使用什么图表类型?看看结果是什么样子有助于更好地理解问题。
  • 现在我只使用点图,但我需要花一些时间找出最适合热图的样式。回到我的电脑后,我可以发布当前外观的屏幕截图。
  • 您的问题解决了吗?
  • @TaW,在过去的几周里,我忙于其他事情。一旦我回到这个问题并尝试一切,我会接受你的回答。

标签: c# .net winforms charts


【解决方案1】:

假设您要创建一个类似于我的示例herehereHeatmap,恐怕为此目的使用Chart 控件可能不是最佳选择。

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

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

  • 这些比较贵

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

您询问了DataBinding 以使整个事情更有效率。

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

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

当使用列表或数组等非表格数据源时,您可以 仅绑定 Y 值,而不管数据绑定方法的类型 用过的。这是因为不能为 X 值指定列,并且 其他图表属性,例如 Tooltip。

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

嗯,many ways 可以在 ChartChart 级别使用 DataBinding

甚至还有一个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 却没有:

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

Here 是支持的属性列表:

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

结论:Afaik DataBinding不会让你设置colored DataPoints。要使用Chart 控件使您的代码更有效,您可以简单地尝试使用chart1.SuspendLayoutchart1.ResumeLayout 使设置全部完成。

不过,我会首先考虑不使用图表控件。

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

  • 第一个是关于在 GDI+ 中绘制热图的。这真的很简单而且非常有效。 (帖子中的详细信息可能与您的问题无关。)对于简单的缩放,我建议您将其绘制成Bitmap,然后将其分配给PanelPictureBox;在ClientSize 中创建它并将Panel.ImageLayout(或PictureBox.SizeMode)设置为Stretch

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

查看第二个链接,了解创建漂亮List<Color> 的方法!

【讨论】:

  • 看起来一些 MS 傻瓜已经杀死了图表绑定的链接 :-( - 如果有人找到它,我很高兴收到你的来信。否则你会在 waybackmachine 中找到它。..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-22
  • 2021-05-01
相关资源
最近更新 更多