2016-06-16 5 views
0

グラフを左右にスクロールするには、MSChartをクリックして左右にドラッグする方法はありますか? アイデアは、チャートのスクロールバーをドラッグする代わりに、チャートをドラッグすることです。 私は単にスクロールバーを使用していない理由は、この機能(ボスとその要求..)を追加するように求められたためです。 Btw、私はC#とwinformsを使用しています。 私は十分に明確だったと思っています。 ありがとうございます!グラフをスクロールするためにグラフをドラッグする

答えて

1

はいこれが可能です。

通常のズーム/スクロールの仕組みは、チャート上でドラッグするだけで使用できないという問題が1つあります。

代わりに2つのマウスイベントをコードし、Axis.PixelPositionToValue関数を使用してデータ値にアクセスします。

まず私たちがクリックした場所のデータ値を格納します。

double mDown = double.NaN; 

private void chart1_MouseDown(object sender, MouseEventArgs e) 
{ 
    Axis ax = chart1.ChartAreas[0].AxisX; 
    mDown = ax.PixelPositionToValue(e.Location.X); 
} 

その後、我々はAxis.Minimumが移動しMinimumMaximumを適応しているどのくらい古いの範囲を計算します。

private void chart1_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (!e.Button.HasFlag(MouseButtons.Left)) return; 
    Axis ax = chart1.ChartAreas[0].AxisX; 
    double range = ax.Maximum - ax.Minimum; 
    double xv = ax.PixelPositionToValue(e.Location.X); 
    ax.Minimum -= xv - mDown; 
    ax.Maximum = ax.Minimum + range; 
} 

あなたがお勧めしますあまりにも左または右にドラッグを防止するためにいくつかのチェックを追加する。

コードでは、yあなたはMinimumMaximumを設定しました!

また、x軸ラベルの書式を制御して、小数点の桁数が多いためにグラフが跳ね返らないようにする必要があることにも注意してください。

それとも、あなたのデータに応じて、あなたは、単にintsにあなたの間隔または私の場合は、適切ないくつかの値の倍数にステップを設定することもできます。あなたが持っている必要がある場合は

ax.Minimum -= (int)(xv - mDown) ; 

表示されるスクロールバーは、上記のコードを引き続き使用できます。しかし、このは正常scollingと干渉しを行い

double oldPos = ax.ScaleView.Position; 
ax.ScaleView.Position -= (xv - mDown); 

:しかし、あなたは、このことによって、この

ax.Minimum -= (int)(xv - mDown); 
ax.Maximum = ax.Minimum + range; 

を交換する必要があります。スクロールバーに次のように当たっていないことを確認するために小切手を挿入することができます。

RectangleF ipar = InnerPlotPositionClientRectangle(chart1, chart1.ChartAreas[0]); 
if (ipar.Contains(e.Location)) 
{ 
    .. 
    .. 

でもまだここで動作します。だからまたはが最もうまくいくようです。

InnerPlotPositionClientRectangleは、hereと定義されています。

関連する問題