Как я могу заставить DataPoint.Tooltip работать должным образом?

Я сделал класс Chart. Я даю нашему стороннему программному обеспечению возможность добавлять серии с подсказками. Но подсказки не работают.

Самое смешное, что всплывающая подсказка иногда работает в стороннем программном обеспечении. Когда я проверяю это в форме окна, это никогда не работает...

Что я делаю неправильно?

Учебный класс:

public class DollarChart : System.Windows.Forms.DataVisualization.Charting.Chart

Инициализация:

public void Wrapper_Init()
{
System.Windows.Forms.DataVisualization.Charting.ChartArea chartArea1;
System.Windows.Forms.DataVisualization.Charting.Series MySeries2;
chartArea1 = this.ChartAreas["ChartArea1"];
MySeries2 = this.Series["Series1"];

chartArea1.Name = "Default";

chartArea1.AxisY.IntervalAutoMode = System.Windows.Forms.DataVisualization.Charting.IntervalAutoMode.FixedCount;
chartArea1.AxisY.Enabled = System.Windows.Forms.DataVisualization.Charting.AxisEnabled.True;

chartArea1.AxisY2.IntervalAutoMode = System.Windows.Forms.DataVisualization.Charting.IntervalAutoMode.FixedCount;

// Invisible series in order to make room for primary Y-axis on chartarea.
MySeries2.Points.Add(0);
MySeries2.Points.Add(490);
MySeries2.Color = System.Drawing.Color.FromName("Transparent");

this.Name = "chart1";
}

Функция для вставки данных:

public void Wrapper_Populate(System.Single[] AvailDollars, int SeriesSplitter, int PlotHours)
{
System.Double[] Dollars;
Dollars = new System.Double[AvailDollars.Length];
AvailDollars.CopyTo(Dollars,0);
System.Double[] buffer;
buffer = new System.Double[SeriesSplitter];

System.Windows.Forms.DataVisualization.Charting.Series MySeries = new System.Windows.Forms.DataVisualization.Charting.Series();
MySeries.ChartType = System.Windows.Forms.DataVisualization.Charting.SeriesChartType.StackedColumn;

Array.Copy(Dollars, 0, buffer, 0, SeriesSplitter); // Copies from the correct place in the array.
int n = 0;
foreach (double p in buffer)
{
  System.Windows.Forms.DataVisualization.Charting.DataPoint Pointer = new System.Windows.Forms.DataVisualization.Charting.DataPoint();
  Pointer.YValues[0] = p;
  Pointer.ToolTip = "Testing123";
  MySeries.Points.Add(Pointer);
  if (n == (PlotHours-1)) { break; }
  n++;
}

MySeries.Name = "Stacked_Dollars";
MySeries.YAxisType = System.Windows.Forms.DataVisualization.Charting.AxisType.Secondary;
this.Series.Add(MySeries);

Причина установки всплывающей подсказки для каждой точки данных заключается в том, что я буду отображать вычисленную сумму для всех серий и значение для конкретной серии в каждой точке данных. Причина для создания array.copy состоит в том, что я получаю значения, аккуратно упакованные в массив из 600 элементов, разделенных на секции для каждой серии, кроме того, мне нужно преобразовать System.Single в System.Double.

Я уверен, что вы спросите, почему я это делаю. Использовали стороннее программное обеспечение, которое использует то, что называется quickscript.net. Одной из вещей, которой не хватает стороннему программному обеспечению, является создание диаграмм. Однако мы можем импортировать пользовательские элементы управления. Поэтому мы должны обойти ограничения, создав то, что они называют "Клиентские элементы управления" и "Библиотека функций скрипта".

1 ответ

Решение

Я пробовал разные небольшие твики, но ни один из них, похоже, не работает. То, что, кажется, работает, делает самый удачный обходной путь, хотя мне это не очень нравится. Проблема в том, что ключевые слова, которые вы можете использовать, например "#VAL" и "\n", не работают, когда вы копируете подсказку. Так что вам действительно нужно перевести их в обработчик событий.

Это решение проблемы, но не решение. Поэтому я не приму его, если в следующем месяце не появятся другие ответы.

this.GetToolTipText += new System.EventHandler<System.Windows.Forms.DataVisualization.Charting.ToolTipEventArgs>(this.Chart1_GetToolTipText);

private void Chart1_GetToolTipText(object sender, System.Windows.Forms.DataVisualization.Charting.ToolTipEventArgs e)
{
  // Check selected chart element and set tooltip text
  if (e.HitTestResult.ChartElementType == ChartElementType.DataPoint)
  {
    int i = e.HitTestResult.PointIndex;
    DataPoint dp = e.HitTestResult.Series.Points[i];
    decimal YValue = System.Convert.ToDecimal(dp.YValues[0]);
    YValue = System.Math.Round(YValue, 2);
    e.Text = dp.ToolTip.Replace("\\n","\n").Replace("#VAL",YValue.ToString());
  }
}
Другие вопросы по тегам