Двойная метка при добавлении точки данных в mschart - PullRequest
0 голосов
/ 13 ноября 2018

Я пишу код на C # .Net WinForms, чтобы добавить метку при нажатии на некоторые точки данных на графике.Прежде чем щелкнуть диаграмму, график выглядит следующим образом.

Chart before click

Теперь я щелкаю точку данных между 330-340.Диаграмма показывает выбранную точку данных с двойной меткой (338.61).Как показано ниже: Chart after click

Ниже приведены выходные данные отладки: Debug Output

Ниже приведен код для 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();
        }                 
    }
}

Что не так с кодом?

1 Ответ

0 голосов
/ 26 ноября 2018

Это на самом деле довольно интересное наблюдение ..

Давайте посмотрим на вторую версию, которая прекрасно работает для вас:

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) - DataPoints в серии first (series0).

Это ведет себя на удивление по-другому ..:

Можно представить, что DataPoint перемещается перемещается (как было бы Controls), но это не так. Или клонируется как строки.

Вместо только новая ссылка создается и добавляется к series1.Points. Это имеет несколько удивительных последствий ..:

  • Обе ссылки указывают на один и тот же объект данных ; так внезапно возникает точка в series1 со свойствами, взятыми из series0, включая IsValueShownAsLabel!

  • Так как обе серии теперь содержат точку данных с одинаковыми значениями / координатами, диаграмма достаточно умна, чтобы немного разметить их метки, чтобы избежать наложения. Это эффект, который вы видите.

  • Если вы теперь удалите точку данных из своей исходной серии 0, серия 1 все равно будет содержать ссылку на нее с цветом, меткой и т. Д., Как это было в серии 0 ..

Так что, действительно, нет способа заставить исходную версию работать, так как две ссылки на одну и ту же точку всегда заставят диаграмму отображать метку либо дважды, либо вообще не будут.

...