我正在使用一个生成数据点热图的Windows窗体应用程序。我正在使用一个名为“管道”的自定义结构列表,其中包含自己的数据点列表。然后我遍历我的列表列表,如下所示:
foreach (NewPipe pipe in wall)
{
foreach (DataPoint x in pipe.returnPoints(xNum))
{
chart1.Series["Series1"].Points.Add(x);
}
xNum++;
}
虽然这种方法有效但看起来非常低效。如果我可以更新我的列表列表并更新图表,而不是必须清除它并重新绘制它(或手动删除删除的数据等),这将是很好的。我熟悉BindingList结构,这是正确使用的工具,如果是这样,如何将列表中的列表绑定到图表? (因为我真的在存储在较低层列表的列表中的数据之后)。也许我完全使用了错误的结构? (尽管列表列表实际上与数据的生成方式相当匹配)。
答案 0 :(得分:2)
假设您要创建Heatmap,其外观类似于我的示例here或here,我担心为此目的使用Chart
控件可能不是最好的选择。
虽然使用Charttype Point
创建它并非不可能,但它会有几个问题。
最值得注意的是,您必须为地图中的每个点创建单独的DataPoints
。
这些相当昂贵
Series.MarkerSize
设置为合适的像素数来设置其大小,但在调整大小时必须进行调整。 您已询问DataBinding
以提高整体效率。
您使用的是DataPoints
列表,但是:
DataBinding
仅将值绑定到图表,而不是现成的DataPoints
使用非表格数据源(如列表或数组)时,可以 无论数据绑定方法的类型如何,仅绑定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
但是,虽然bindable
和DataBinding
确实受到约束,但DataPoints
却没有:
这令人失望;毕竟DataPoint.Color是Chart
属性。但它被忽略了。
Here是受支持的属性列表:
这些属性的列表如下:AxisLabel,Tooltip,Label, LegendText,LegendTooltip和CustomPropertyName(一个名字 自定义属性)。
结论:Afaik chart1.SuspendLayout
将不让您设置彩色 chart1.ResumeLayout
。要使用Bitmap
控件提高代码效率,您只需尝试使用Panel
和PictureBox
即可完成设置。
但我首先考虑不使用Chart控件。
我在第一段中给出的两个例子的链接显示了两种不同的方式:
第一个是关于在GDI +中绘制热图。这非常简单而且效率很高。 (帖子中的详细信息可能与您的问题无关。)对于简单缩放,我建议您绘制ClientSize
,并将其分配给Panel.ImageLayout
或PictureBox.SizeMode
;在Stretch
中创建它,并将Cells
(或DataGridView
)设置为List<Color>
。
第二个示例使用WHERE o70vm_invoices_items.invoice_id = $invoiceID
GROUP BY o70vm_invoices_items.invoice_id
的{{1}}作为热图的大'像素'...
请参阅第二个链接,了解创建好invoice_id
的方法!