Событие Chart Click не обрабатывает две точки данных с одинаковыми координатами x и y

У меня проблема с отображением двух меток в одной точке координат. Проблема возникает, когда два разных объекта в массиве имеют одинаковые значения x и y. Все приложение представляет собой план завода, который показывает деятельность в разных местах завода и ставит «Маркер» с помощью координат объектов. Вы можете рассмотреть это на примере семьи, в которой все люди имеют разные характеристики, такие как возраст, рост, вес, цвет лица, но они по-прежнему живут в одном и том же месте или месте своего дома.

Код VB описывает эту проблему как:

For Index_i = 0 To myTotalFiles - 1
  For Index_j = 0 To TotalLine - 1
    If (Worker(Index_i).Location = MapLocations(Index_j).NameOfLocation) Then
       Worker(Index_i).X = MapLocations(Index_j).XCoord
       Worker(Index_i).Y = MapLocations(Index_j).YCoord
       series.Points.AddXY(Worker(Index_i).X, Worker(Index_i).Y)                    
    End If
    Next
 Next

MapLocations () - это массив объектов, содержащий три свойства: NameOfLocation, XCoord и YCoord.

Line Worker (Index_i) .Location = MapLocations (Index_j) .NameOfLocation Сравнивает местоположение рабочего (String) с местоположением MapLocation MapLocations (Index_j). NameOfLocation (String), если оно совпадает, дает рабочему пару координат как

Worker(Index_i).X = MapLocations(Index_j).XCoord
Worker(Index_i).Y = MapLocations(Index_j).YCoord

и добавьте маркер на график.

В диаграмме также реализовано отображение сообщения или всплывающей подсказки при нажатии на маркер. Если два рабочих процесса имеют одинаковые значения x и y, тогда маркеры будут точно перекрываться и не будут давать информацию для них обоих. Как этого можно избежать.

Событие щелчка на графике представлено как:

Private Sub Chart1_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles Chart1.Click
        Try
            Dim pointindex As Integer
            Dim result As HitTestResult
            result = Chart1.HitTest(Cursor.Position.X, Cursor.Position.Y)
            If result.ChartElementType = ChartElementType.DataPoint Then
                pointindex = result.PointIndex
                MsgBox("Worker is working at: " + Worker(pointindex).Location + vbLf+ "With Scope of work: " + Worker(pointindex).Scope)
            End If
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub

Все координаты для местоположения на карте сохраняются в файле и читаются, а затем сопоставляются с местоположением рабочего и затем с местом маркер в этой точке


person Asif Hussain    schedule 02.10.2018    source источник
comment
Какой ChartType вы используете? Вы можете показать настоящую диаграмму?   -  person TaW    schedule 04.10.2018
comment
Поскольку для этого типа построения местоположения требуется диаграмма рассеяния, я использовал: Dim series As New Series series.ChartType = SeriesChartType.Point Изображение также прилагается с этим вопросом для пояснения.   -  person Asif Hussain    schedule 04.10.2018


Ответы (1)


Вот процедура C#, которая извлекает все точки с теми же значениями x и y, что и выбранная вами, то есть верхняя / последняя:

    private void chart_MouseClick(object sender, MouseEventArgs e)
    {
        var hitt = chart.HitTest(e.X, e.Y);
        Text = hitt.PointIndex + "";

        if (hitt.PointIndex >= 0)
        {
           DataPoint dp = chart.Series[0].Points[hitt.PointIndex];
           var points = chart.Series[0].Points.
                    Where(x => x.XValue == dp.XValue && 
                               x.YValues[0] == dp.YValues[0]);
           ..  // now you can enumerate all the points to create a message..
           foreach (DataPoint p in points)..
        }
}

Версия VB должна быть похожей.

person TaW    schedule 04.10.2018