【发布时间】:2017-10-17 15:41:16
【问题描述】:
我有一个 C#.NET Windows 窗体应用程序,它使用带有多个线系列的图表。我有一个存储读数的物理设备,当我下载读数时,我希望图表能够填写详细信息。
我在软件中为可量化的值(例如温度)创建了类型,这些值可能会根据位置使用不同的单位,允许我对显示单位进行用户设置,并且只需在后台处理所有内容而无需关心,并且当它显示给用户时,它的单位是正确的。
C#.NET Charting.Series 类非常严格,当尝试使用绑定数组进行绘制时,它会抛出一个带有以下语句的 ArgumentExeption:“系列数据点不支持 Units.Temperature 类型的值,只有这些类型的值可以可使用:Double、Decimal、Single、int、long、uint、ulong、String、DateTime、short、ushort"。
Temperature 类型有一个名为 Value 的属性,它是一个 double,并且可以隐式转换为 double,但这似乎无关紧要。我希望有一种方法可以绑定它,以便在它从结果数组中请求值时进行转换,以便它可以正确绘制图形,任何人都知道这是怎么回事 可以做吗?
我希望避免使用 LogItem[] 和次要的 double[] 来进行转换。
private LogItem[] results;
private async void GraphPage_Load(object sender, EventArgs e) {
var count = await device.LogCount.Read(CancelToken);
results = new LogItem[count];
graph.DataSource = results;
graph.Series[0].XValueMembers = nameof(LogItem.DateTime); //Type is System.DateTime
graph.Series[0].YValueMembers = nameof(LogItem.Temperature); //Type my library, Units.Temperature
var prog = new Progress<double>();
prog.ProgressChanged += (sender2, e2) => {
BeginInvoke(new Action(() => {
progBar.Value = results.Count(log => !Equals(log, LogItem.Empty));
CheckEmptyPoints(); //Sets or clears Points[x].IsEmpty;
graph.Invalidate(); //Force graph to draw new results, maybe a better way of doing this?
}));
};
await device.DownloadLogs(CancelToken, results, prog); //Takes output buffer and IProgress to report more data has been downloaded.
}
【问题讨论】:
标签: c# .net winforms data-binding charts