如何在.Net WinForms图表控件中检索所选范围?

时间:2013-04-03 00:56:20

标签: c# winforms charts

我正在使用C#内置的Winforms Chart控件(System.Windows.Forms.DataVisualization.Charting.Chart)及其内置功能,让用户选择一个范围。我想做的是回读用户选择的范围。当然必须有一些简单的方法来做到这一点,但我一直无法找到它。

光标启用如下:

var ca = chart1.ChartAreas["ChartArea1"].CursorX;
ca.CursorX.IsUserEnabled = true;
ca.CursorX.IsUserSelectionEnabled = true;

我知道当用户通过启用ca.AxisX.ScaleView.Zoomable选择范围时,我可以缩放图表,但我不希望图片发生变化:相反,我使用图表作为显示信息的方式然后让用户选择一系列X值,然后进行一些额外的处理。

我尝试连接到chart1.SelectionRangeChanged并确实每次更改范围时都会触发 - 我似乎无法从CursorEventArg中获取选择范围。它有“NewSelectionStart”和“NewSelectionEnd”字段,但这些字段为NaN,令人失望。我试着查看图表和轴的各种属性,但没有找到任何听起来很有希望的东西。

进一步调查显示ChartArea.CursorX.SelectionStart属性听起来正是我需要的......除了它也是NaN。我不知道这是正常还是我遇到某种错误?

那么,我怎样才能确定用户选择的范围?

2 个答案:

答案 0 :(得分:7)

好吧,好吧,我明白了。这是独家新闻:

有一个SelectionRangeChang * ing *事件,当该事件运行时,ChartArea.CursorX.SelectionStartChartArea.CursorX.SelectionEnd字段中包含正确的值。但是用户还没有释放鼠标按钮,所以你应该只存储它们。

当用户释放鼠标按钮时,将触发SelectionRangeChang * ed *事件。不知何故,它的设计方式使SelectionStart和SelectionEnd重置为NaN(就像事件参数中的NewSelectionStartNewSelectionEnd字段一样)。你要做的就是使用你从其他事件处理程序中获取的值,因为你知道时间是正确的。

所以你有它!希望这个答案能够让其他人免于浪费时间。

答案 1 :(得分:0)

除了 redtuna 以外,还可以在c#图表中设置光标:

使用“ SelectionRangeChang ing ”而不是“ SelectionRangeChang ed ”来解决NaN问题对我来说很有效:

初始化表单时

this.chart1.SelectionRangeChanging += chart1_SelectionRangeChanging;

        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;
        chart1.ChartAreas[0].CursorX.Interval = 0.01;               // set "resolution" of CursorX

如果选择了范围/设置了光标,将会执行什么

private void chart1_SelectionRangeChanging(object sender, CursorEventArgs e)
    {
        double x1 = x1 = e.NewSelectionStart; // or: chart1.ChartAreas[0].CursorX.SelectionStart;
        double x2 = e.NewSelectionEnd;        // or: x2 = chart1.ChartAreas[0].CursorX.SelectionEnd;

        double diffx1x2 = x2 - x1;
    }    

要放大和缩小(x轴),我只添加了一个获取光标值的按钮。这样,通过mouseClick缩放(ScaleView.Zoomable = false;)不会干扰我的光标定位:)

 private void button_ZoomIn(object sender, EventArgs e)
    {
        double x1 = chart1.ChartAreas[0].CursorX.SelectionStart;  // x1 = X1
        double x2 = chart1.ChartAreas[0].CursorX.SelectionEnd;    // x2 = X2

        if (x2 > x1)
        {
            // hard setting: chart1.ChartAreas[0].AxisX.Minimum = x1;
            // hard setting: chart1.ChartAreas[0].AxisX.Maximum = x2;
            chart1.ChartAreas[0].AxisX.ScaleView.Zoom(x1,x2); // dynamic approach with scrollbar
        }
        else
        {
            chart1.ChartAreas[0].AxisX.ScaleView.Zoom(x2,x1);
        }
    }

缩小

private void button_ZoomOut(object sender, EventArgs e)
    {
        chart1.ChartAreas[0].AxisX.ScaleView.ZoomReset(0);
    }

缩放也可以通过mouseWheel:how to enable zooming in Microsoft chart control by using Mouse wheel来实现 另外,如果您还想在图表中右键单击操作,请执行以下操作:How to get a right click mouse event? Changing EventArgs to MouseEventArgs causes an error in Form1Designer?