如何在 Visual Studio Windows 表格中创建最小值和最大值不是数字而是字符串的图表?
How do I create a chart in Visual Studio Windows Form whose minimum and maximum values are not numbers but strings?
我正在尝试在 Visual Studio 2015 Windows Forms 应用程序中创建图表,该应用程序将绘制来自传感器的数据并在 x 轴上显示每个点及其接收时间。我已经创建了我在以下代码中尝试的简化版本。在这里,我跟踪通用点并将字符串放在 x 轴上。我的问题是 我不希望我的初始点或最大点分别为零,而是我的矢量 (vec) 的第一个和最后一个字符串。
.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace WindowsFormsApplication18
{
public partial class Form1 : Form
{
string[] vec = new string[7]
{ "11:00", "12:00", "1:00", "2:00", "3:00", "4:00", "5:00" };
int i = 0;
int n = 1;
int f = 0;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Interval = 1000;
if (f == 2)
{
f = 0;
}
if (f == 0)
{
timer1.Start();
}
if (f == 1)
{
timer1.Stop();
}
f++;
}
private void timer1_Tick(object sender, EventArgs e)
{
textBox1.Text = i.ToString();
this.chart1.Series["Series1"].Points.AddXY(vec[i], (2 * i));
i = i + (n * 1);
if (i == vec.Length)
{
n = -1;
i = 5;
}
if (i==0)
{
n = 1;
}
}
}
}
你应该永远不要为x-values使用字符串,除非它们实际上没有意义,比如城市或人名。
Strings
被 复制 到 axis-labels 但否则转换为 doubles
出来 0s
(!!) ;这意味着你不能使用它们任何东西。
但您可能希望将它们用于:
- 格式化(你需要)
- 设置显示范围(你也想要)
- 设置缩放范围
- 工具提示
- 计算
- 表达式
- 等..
因此您应该将它们添加 作为数字 或 作为 DateTimes
。这是一个示例和结果:
Series s = chart.Series[0];
// string[] vec = new string[7]
// { "11:00", "12:00", "1:00", "2:00", "3:00", "4:00", "5:00" };
TimeSpan[] tvec = new TimeSpan[7]
{ new TimeSpan( 11, 0, 0), new TimeSpan( 12, 0, 0), new TimeSpan( 13, 0, 0),
new TimeSpan( 14, 0, 0) ,new TimeSpan( 15, 0, 0) ,new TimeSpan( 16, 0, 0),
new TimeSpan( 17, 0, 0) };
DateTime d0 = new DateTime(0);
foreach (var t in tvec)
s.Points.AddXY(d0.Add(t), t.Hours);
ChartArea ca = chart.ChartAreas[0];
s.XValueType = ChartValueType.DateTime;
ca.AxisX.LabelStyle.Format = "h:mm";
ca.AxisX.Minimum = d0.Add(tvec.First()).ToOADate();
ca.AxisX.Maximum = d0.Add(tvec.Last()).ToOADate();
一些补充说明:
- 请注意特殊转换函数
ToOADate
and the complementary FromOADate
!
- 要创建
TimeSpans
,我们需要使用24h
格式。
- 您可以使用 "H:mm" 格式字符串以
24h
格式显示时间。
- 我会使用
List<Tmespan>
并在循环中填充它,甚至使用 LINQ:
List<TimeSpan> tvec = Enumerable.Range(11, 7).Select(x => new TimeSpan(x, 0, 0)).ToList();
我正在尝试在 Visual Studio 2015 Windows Forms 应用程序中创建图表,该应用程序将绘制来自传感器的数据并在 x 轴上显示每个点及其接收时间。我已经创建了我在以下代码中尝试的简化版本。在这里,我跟踪通用点并将字符串放在 x 轴上。我的问题是 我不希望我的初始点或最大点分别为零,而是我的矢量 (vec) 的第一个和最后一个字符串。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
namespace WindowsFormsApplication18
{
public partial class Form1 : Form
{
string[] vec = new string[7]
{ "11:00", "12:00", "1:00", "2:00", "3:00", "4:00", "5:00" };
int i = 0;
int n = 1;
int f = 0;
public Form1()
{
InitializeComponent();
}
private void button1_Click(object sender, EventArgs e)
{
timer1.Interval = 1000;
if (f == 2)
{
f = 0;
}
if (f == 0)
{
timer1.Start();
}
if (f == 1)
{
timer1.Stop();
}
f++;
}
private void timer1_Tick(object sender, EventArgs e)
{
textBox1.Text = i.ToString();
this.chart1.Series["Series1"].Points.AddXY(vec[i], (2 * i));
i = i + (n * 1);
if (i == vec.Length)
{
n = -1;
i = 5;
}
if (i==0)
{
n = 1;
}
}
}
}
你应该永远不要为x-values使用字符串,除非它们实际上没有意义,比如城市或人名。
Strings
被 复制 到 axis-labels 但否则转换为 doubles
出来 0s
(!!) ;这意味着你不能使用它们任何东西。
但您可能希望将它们用于:
- 格式化(你需要)
- 设置显示范围(你也想要)
- 设置缩放范围
- 工具提示
- 计算
- 表达式
- 等..
因此您应该将它们添加 作为数字 或 作为 DateTimes
。这是一个示例和结果:
Series s = chart.Series[0];
// string[] vec = new string[7]
// { "11:00", "12:00", "1:00", "2:00", "3:00", "4:00", "5:00" };
TimeSpan[] tvec = new TimeSpan[7]
{ new TimeSpan( 11, 0, 0), new TimeSpan( 12, 0, 0), new TimeSpan( 13, 0, 0),
new TimeSpan( 14, 0, 0) ,new TimeSpan( 15, 0, 0) ,new TimeSpan( 16, 0, 0),
new TimeSpan( 17, 0, 0) };
DateTime d0 = new DateTime(0);
foreach (var t in tvec)
s.Points.AddXY(d0.Add(t), t.Hours);
ChartArea ca = chart.ChartAreas[0];
s.XValueType = ChartValueType.DateTime;
ca.AxisX.LabelStyle.Format = "h:mm";
ca.AxisX.Minimum = d0.Add(tvec.First()).ToOADate();
ca.AxisX.Maximum = d0.Add(tvec.Last()).ToOADate();
一些补充说明:
- 请注意特殊转换函数
ToOADate
and the complementaryFromOADate
! - 要创建
TimeSpans
,我们需要使用24h
格式。 - 您可以使用 "H:mm" 格式字符串以
24h
格式显示时间。 - 我会使用
List<Tmespan>
并在循环中填充它,甚至使用 LINQ:
List<TimeSpan> tvec = Enumerable.Range(11, 7).Select(x => new TimeSpan(x, 0, 0)).ToList();