【问题标题】:Double label while adding a datapoint in mschart在 mschart 中添加数据点时使用双标签
【发布时间】:2018-11-13 04:35:21
【问题描述】:

我正在 C#.Net WinForms 中编写代码,以便在单击图表上的某些数据点时添加标签。 在点击图表之前,图表如下所示。

现在我单击 330-340 之间的数据点。该图表显示了带有双标签 (338.61) 的选定数据点。如下所示:

以下是调试输出:

下面是 chart_mouseclick 的代码

private void chart1_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {               
        double mouse_Xvalue = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);
        double mouse_Yvalue = chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);

        DataPoint Prev_DataPoint = chart1.Series[0].Points.Select(x => x)
            .Where(x => x.XValue >= mouse_Xvalue)
            .DefaultIfEmpty(chart1.Series[0].Points.First()).First();

        DataPoint Next_DataPoint = chart1.Series[0].Points.Select(x => x)
            .Where(x => x.XValue <= mouse_Xvalue)
            .DefaultIfEmpty(chart1.Series[0].Points.Last()).Last();

        DataPoint Add_DataPoint = Math.Abs(Prev_DataPoint.XValue - mouse_Xvalue) < Math.Abs(Next_DataPoint.XValue - mouse_Xvalue) ? Prev_DataPoint : Next_DataPoint;

        int add_data_point_index = chart1.Series[0].Points.IndexOf(Add_DataPoint);

        DataPoint max = Add_DataPoint;
        for (int i = add_data_point_index - 10; i <= add_data_point_index + 10; i++)
        {
            DataPoint dp = chart1.Series[0].Points[i];

            if (dp.YValues[0] > max.YValues[0])
            {
                add_data_point_index = i;
                max = dp;
            }
        }

        chart1.Series[1].Points.Add(max);
        chart1.Series[1].Sort(PointSortOrder.Ascending, "X");

        for (int i = 0; i < chart1.Series[1].Points.Count; i++)
        {
            chart1.Series[1].Points[i].Label = 
            Math.Round(chart1.Series[1].Points[i].XValue, 2).ToString();
        }                 
    }
}

代码有什么问题?

【问题讨论】:

  • 你试过调试你的代码吗?
  • 是的。 @AccessDenied
  • 你的数组中有重复的点吗?
  • @AccessDenied 没有重复点。我在添加数据点之前和之后检查了Series.Point.CountSeries.Point.Count 只增加一,点击后。
  • 通常不需要刷新图表。 - 你的问题是什么 ?你不添加一个新的数据点吗?为什么它带有标签令人惊讶?另外:除了对点进行排序之外,您还可以在正确的位置插入。

标签: c# .net charts label mschart


【解决方案1】:

这实际上是一个非常有趣的观察..

让我们看看第二个版本,它适合你:

chart1.Series[1].Points.AddXY(max.XValue, max.YValue[0])

或简而言之:

series1.Points.AddXY(x,y);

这是添加DataPoints 的常规方法:创建一个新点,其中包含两个(或更多)值以及取自Series 默认值 的所有其他属性强>。

“其他”属性包括颜色、标记和标签数据,包括IsValueShownAsLabel

这里没有惊喜。

现在是原始版本:

chart1.Series[1].Points.Add(max);

或者简而言之

series1.Points.Add(dp);

其中max(或dp)是第一个系列中的DataPointsseries0)。

这表现惊人的不同..:

可以想象DataPoint移动(就像Controls 一样),但事实并非如此。或者像字符串一样被克隆。

而是只创建一个新引用并将其添加到series1.Points。这有几个令人惊讶的后果..:

  • 两个引用都指向同一个数据点对象;所以突然在 series1 中有一个点,其属性取自 series0,包括IsValueShownAsLabel

  • 由于两个系列现在都包含具有相同值/坐标的数据点,因此图表足够智能,可以稍微分开显示它们的标签以避免重叠。 这是你看到的效果。

  • 如果您现在从其原始 series0 中删除数据点,则 series1 仍将包含对它的引用,包括颜色、标签等,就像在 series0 中一样。

因此确实没有办法使原始版本工作,因为对同一点的两次引用总是会使图表显示标签两次或根本不显示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多