Создание всплывающих подсказок для динамических диаграмм

Я использую Visual Studio 2010 и WFC для создания точечного графика данных. Чтобы создать диаграмму, у меня есть таблица данных с 3 разными столбцами; это дата, значение и серийный номер. Эта таблица создается динамически из SQL-запроса, а затем я отмечаю дату по оси x и значение по оси y. Я пытаюсь добиться того, чтобы, когда мышь находится над точкой на диаграмме, подсказка отображала дату, значение и уникальный серийный номер, относящийся к этим значениям. На данный момент я использую

myChart.Series["mySeries"].ToolTip = "XValue = #VALY \r\nDate = #VALX{d}";

однако очевидно, что это не показывает серийный номер против этих значений. Я попытался использовать событие ToolTip, однако у меня возникли проблемы при попытке преобразовать точку данных в пикселях в точный график на графике. Я надеюсь, что этот вопрос имеет смысл.


person manicmonkey21421    schedule 21.01.2013    source источник


Ответы (2)


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

        int points = 0;

        //For every row in the values table, plot the date against the variable value
        foreach (DataRow row in Values.Rows)
        {
            myChart.Series[Variable].Points.AddXY(Convert.ToDateTime(row["Date"].ToString()), row["Variable"].ToString());               
            myChart.Series[Variable].Points[points].ToolTip = Variable + " = #VALY \r\nDate = #VALX{d} \r\nSerial = " + row["Serial"].ToString();
            points += 1;
        }

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

person manicmonkey21421    schedule 21.01.2013
comment
Большое спасибо. Вы сэкономили мое время. - person Chandan Kumar; 18.11.2013

просто для идеи

For i As Integer = 0 To dt.Rows.Count - 1
                    StrSeries = Convert.ToString(dt.Rows(i)("Engage_Title"))
                    ChartRecentActivities.Series.Add(StrSeries)
                    ChartRecentActivities.Series(StrSeries).ChartType = SeriesChartType.Line
                    ChartRecentActivities.Series(StrSeries).MarkerStyle = MarkerStyle.Circle
                    ChartRecentActivities.Series(StrSeries).MarkerSize = 7
                    ChartRecentActivities.Series(StrSeries).BorderWidth = 3
                    ChartRecentActivities.Series(StrSeries).ShadowOffset = 2
                    ChartRecentActivities.Series(StrSeries).Legend = "Default"
                    ChartRecentActivities.Series(StrSeries).LegendText = StrSeries
                    ChartRecentActivities.Series(StrSeries).LegendToolTip = StrSeries
                    ChartRecentActivities.Series(StrSeries).ToolTip = StrSeries

                    For j As Integer = 0 To ChartRecentActivities.ChartAreas(0).Axes(0).CustomLabels.Count - 1
                        dv.RowFilter = "Engage_Title = '" & StrSeries & "' AND Transaction_Date = '" & ChartRecentActivities.ChartAreas(0).Axes(0).CustomLabels(j).Text & "'"
                        If (dv.Count > 0) Then
                            dblPoint = Convert.ToDouble(dv.Item(0)(0))
                        Else
                            dblPoint = 0
                        End If
                        ChartRecentActivities.Series(StrSeries).Points.Add(dblPoint)
                        ChartRecentActivities.Series(StrSeries).Points(j).ToolTip = StrSeries & " = " & dblPoint.ToString()
                    Next
                Next

посмотри на последнюю строчку

ChartRecentActivities.Series(StrSeries).Points(j).ToolTip = StrSeries & " = " & dblPoint.ToString()
person vikas    schedule 21.01.2013
comment
Да, это было только при наведении на точку. Чтобы конечный пользователь мог видеть серийный номер продукта, который имеет определенные значения. Спасибо. - person manicmonkey21421; 21.01.2013
comment
Я попытался преобразовать ваш код из VB в C# (извините, если я не прояснил синтаксис в вопросе) и, похоже, не смог заставить его работать должным образом. Судя по этому коду, похоже, что для каждого серийного номера будет несколько серий (поправьте меня, если я ошибаюсь), и потенциально могут быть сотни серийных номеров. Однако большое спасибо за ответ! - person manicmonkey21421; 21.01.2013
comment
вы правы, на самом деле в вашем случае у вас есть только одна правильная серия, поэтому вы можете удалить внутренний цикл for и изменить логику, или вы можете опубликовать код, чтобы я мог изменить - person vikas; 21.01.2013
comment
На самом деле нет кода для публикации. Просто таблица данных с 3 заголовками столбцов (дата, значение, серийный номер), и для каждой строки в таблице данных я отображаю дату в зависимости от значения. А затем (используя код в исходном вопросе) я установил подсказку, чтобы показать значение и дату. Единственным другим кодом является тот, который определяет название серии. Извините, я не могу больше помочь - person manicmonkey21421; 21.01.2013
comment
Мне удалось заставить его работать, однако, поскольку я новый участник, я не могу ответить на свой вопрос, поэтому, как только истекут мои 8 часов, я опубликую ответ. - person manicmonkey21421; 21.01.2013