C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[1]: chartの範囲指定


(過去ログ 169 を表示中)

[トピック内 2 記事 (1 - 2 表示)]  << 0 >>

■97393 / inTopicNo.1)  chartの範囲指定
  
□投稿者/ 素人44 (9回)-(2021/05/07(Fri) 13:16:57)

分類:[C#] 

現在、下記の様にchartの範囲指定しているのですが、各ポイントをクリックしないと範囲指定が出来ません。
適当な場所を選択し、範囲を指定する事は可能なのでしょうか?

private int Down = 0;
private int Up = 0;

private void chart1_MouseDown(object sender, MouseEventArgs e)
{
    try
    {
        Point mousePoint = new Point(e.X, e.Y);

        chart1.ChartAreas[0].CursorX.SetCursorPixelPosition(mousePoint, true);

        Down = 0;

        result = this.chart1.HitTest(((MouseEventArgs)e).X, ((MouseEventArgs)e).Y);
        if (result.ChartElementType == ChartElementType.DataPoint)
        {
            DataPoint dp = result.Series.Points[result.PointIndex];

            int column = dataGridViewEx2.CurrentCell.ColumnIndex;

            dataGridViewEx2.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
            dataGridViewEx2.CurrentCell = dataGridViewEx2[column, result.PointIndex];
            result.Series.Points[result.PointIndex].Color = Color.Red;

            Down = result.PointIndex;
        }
    }
    catch (Exception ex)
    {
    }

}

private void chart1_MouseUp(object sender, MouseEventArgs e)
{

    try
    {
        if (chkHdel.Checked == true)
        {
            Up = 0;
            Point mousePoint = new Point(e.X, e.Y);

            chart1.ChartAreas[0].CursorX.SetCursorPixelPosition(mousePoint, true);

            result = this.chart1.HitTest(((MouseEventArgs)e).X, ((MouseEventArgs)e).Y);
            if (result.ChartElementType == ChartElementType.DataPoint)
            {
                DataPoint dp = result.Series.Points[result.PointIndex];

                int column = dataGridViewEx2.CurrentCell.ColumnIndex;

                dataGridViewEx2.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
                dataGridViewEx2.CurrentCell = dataGridViewEx2[column, result.PointIndex];
                result.Series.Points[result.PointIndex].Color = Color.Red;

                Up = result.PointIndex;

            }

            int DownBack = Down;
            int UpBack = Up;

            dataGridViewEx2.MultiSelect = true;

            for (int i = DownBack; i < UpBack; i++)
            {

                dataGridViewEx2.Rows[i].Selected = true;
                dataGridViewEx2.Rows[i].Selected = true;
                result.Series.Points[i].Color = Color.Red;
            }

        }
        
    }
    catch (Exception ex)
    {
    }
}

引用返信 編集キー/
■97405 / inTopicNo.2)  Re[1]: chartの範囲指定
□投稿者/ ぼーちゃん (30回)-(2021/05/10(Mon) 09:47:05)
2021/05/10(Mon) 15:23:05 編集(投稿者)
まず if (result.ChartElementType == ChartElementType.DataPoint)
としているので、Point上以外でのクリック操作が無視されてますね。

あとは、PixelPositionToValueでマウス座標からグラフのXValueが取れるので、
Up, Down時の各XValueを取って判定をするとか?

※dataGridViewEx2やchkHdelは何なのかわからなかったので消してます。
質問時はコピペで実行可能なコードを投稿してもらった方が回答が付きやすいですよ。



private double leftVal;
private double rightVal;

private void chart1_MouseDown(object sender, MouseEventArgs e)
{
    chart1.ChartAreas[0].CursorX.Interval = 0.001; //分かりやすさの為小数位置にもカーソルを表示

    Point mousePoint = new Point(e.X, e.Y);
    chart1.ChartAreas[0].CursorX.SetCursorPixelPosition(mousePoint, true);

    var result = this.chart1.HitTest(mousePoint.X, mousePoint.Y);
    if (result.ChartElementType == ChartElementType.Nothing) return; //チャート範囲外なら処理しない

    //MouseDownした場所のXValue
    leftVal = chart1.ChartAreas[0].AxisX.PixelPositionToValue(mousePoint.X);
}

private void chart1_MouseUp(object sender, MouseEventArgs e)
{
    Point mousePoint = new Point(e.X, e.Y);
    chart1.ChartAreas[0].CursorX.SetCursorPixelPosition(mousePoint, true);

    var result = this.chart1.HitTest(mousePoint.X, mousePoint.Y);
    if (result.ChartElementType == ChartElementType.Nothing) return; //チャート範囲外なら処理しない

    //MouseUpした場所のXValue
    rightVal = chart1.ChartAreas[0].AxisX.PixelPositionToValue(mousePoint.X);

    foreach (var pt in chart1.Series[0].Points)
    {
        if (pt.XValue >= leftVal && pt.XValue <= rightVal)
        {
            //指定範囲に含まれる場合の処理
            pt.Color = Color.Red;
        }
        else
        {
            //指定範囲に含まれない場合の処理
            pt.Color = Color.Blue;
        }
    }
}

引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -