0

Chartクラスを作りました。サードパーティのソフトウェアに、ツールチップでシリーズを追加する機能を提供します。しかし、ツールチップは機能していません。

面白いことに、サードパーティのソフトウェアではツールチップが機能することがあります。Windowsフォームでテストすると、うまくいきません...

私は何を間違っていますか?

クラス:

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 つは、グラフ作成です。ただし、カスタム コントロールをインポートすることはできます。そのため、「クライアント コントロール」と「スクリプト関数ライブラリ」と呼ばれるものを作成して、制限を回避する必要があります。

4

1 に答える 1

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());
  }
}
于 2015-04-09T13:56:16.400 に答える