【问题标题】:Select a timespan in a Visual Studio Chart (C#)在 Visual Studio 图表中选择时间跨度 (C#)
【发布时间】:2021-01-27 10:18:09
【问题描述】:

是否可以(可能使用第三方工具)在图表中添加两条可以移动的线,然后在这两条线的边缘获取两个日期(字符串)?

也许这张图片更好地描述了这个问题。它应该看起来与此类似:

Mockup_picture

已经感谢您的帮助!

【问题讨论】:

  • 您能否澄清一下为什么要在 Visual Studio 中使用它?目前还不清楚您的要求是什么。
  • 它必须使用Visual Studio中的工具Chart或者可以在Visual Studio中实现的工具,因为整个程序,其中Chart只是一小部分必须在VS中实现.
  • MSChart 有一个强大的功能应该可以完成这项工作:注释。它们有很多种,它们可以由用户移动,甚至可以分组。可以锚定到点或值。
  • 必须为数据库备份实施图表。用户应该在图表中选择一个时间跨度,哪些数据应该被备份。图表本身显示每个日期以及在该日期添加到数据库的行数。
  • “在 VS 中实现”是什么意思?你的意思是用户必须在 Visual Studio 中才能使用它?或者您的意思是“我想编写一个 .NET 程序并使用 Visual Studio 来完成”?老实说,这听起来很像是对第三方库/工具推荐的请求——这是题外话。

标签: c# visual-studio charts timespan


【解决方案1】:

您可以尝试通过chart.SelectionRangeChanging事件选择一个时间跨度并获取对应的日期时间。

这是一个代码示例,您可以参考。

private void Form1_Load(object sender, EventArgs e)
        {
            var s = new Series();
            s.ChartType = SeriesChartType.Column;

            var d = new DateTime(2020,10,1);

            s.Points.AddXY(d, 30);
            s.Points.AddXY(d.AddDays(1), 20);
            s.Points.AddXY(d.AddDays(2), 70);
            s.Points.AddXY(d.AddDays(3), 90);
            s.Points.AddXY(d.AddDays(4), 80);
            s.Points.AddXY(d.AddDays(5), 50);
            s.Points.AddXY(d.AddDays(6), 60);
            s.Points.AddXY(d.AddDays(7), 80);
            s.Points.AddXY(d.AddDays(8), 90);

            chart1.Series.Clear();
            chart1.Series.Add(s);


            chart1.Series[0].XValueType = ChartValueType.DateTime;
            chart1.ChartAreas[0].AxisX.LabelStyle.Format = "yyyy-MM-dd";
            chart1.ChartAreas[0].AxisX.Interval = 1;
            chart1.ChartAreas[0].AxisX.IntervalType = DateTimeIntervalType.Days;
            chart1.ChartAreas[0].AxisX.IntervalOffset = 1;

            chart1.Series[0].XValueType = ChartValueType.DateTime;
            DateTime minDate = new DateTime(2020, 10, 01).AddSeconds(-1);
            DateTime maxDate = new DateTime(2020, 10, 08); // or DateTime.Now;
            chart1.ChartAreas[0].AxisX.Minimum = minDate.ToOADate();
            chart1.ChartAreas[0].AxisX.Maximum = maxDate.ToOADate();
            chart1.ChartAreas[0].CursorX.IsUserEnabled = false;         // red cursor at SelectionEnd
            chart1.ChartAreas[0].CursorX.IsUserSelectionEnabled = true;
            chart1.ChartAreas[0].AxisX.ScaleView.Zoomable = false;     // zoom into SelectedRange
            chart1.ChartAreas[0].AxisX.ScrollBar.IsPositionedInside = true;
        }

     
        private void chart1_SelectionRangeChanging(object sender, CursorEventArgs e)
        {
            double x1 = e.NewSelectionStart;
            double x2 = e.NewSelectionEnd;
            DateTime date1 = DateTime.FromOADate(x1);
            DateTime date2 = DateTime.FromOADate(x2);
            txtStart.Text = date1.ToString("yyyy-MM-dd");
            txtEnd.Text = date2.ToString("yyyy-MM-dd");
        }

结果:

【讨论】:

  • 谢谢。那很完美。我添加了一个轨迹栏,当它的值发生变化时,我调整图表中的选定范围。我知道可以用两个滑动元素制作一个轨迹栏,所以我只需要在轨迹栏中的值发生变化时添加一些代码。
猜你喜欢
  • 2014-12-13
  • 1970-01-01
  • 2017-10-11
  • 2017-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多