【问题标题】:Pie chart slice click饼图切片点击
【发布时间】:2017-03-02 18:33:29
【问题描述】:

我正在尝试单击我从 C# 的 Windows 窗体中的工具箱中插入的饼图,并显示该切片的详细信息。现在这是我点击的代码。我想知道这是否是正确的路线或我应该采取的路线。

private void chart1_Click(object sender, EventArgs e)
{
    HitTestResult results = chart1.HitTest((e as MouseEventArgs).X, (e as MouseEventArgs).Y);
}

我也是using System.Windows.Forms.DataVisualization.Charting;

【问题讨论】:

    标签: c# winforms data-visualization pie-chart


    【解决方案1】:

    是的,这是正确的方法。

    您现在可以测试DataPoint 是否有效等。

    我会使用MouseClick btw,默认情况下有MouseEventArgs

    您甚至可以编写 MouseMove 事件并使用相同的命中测试来控制光标以显示用户位于数据点上方..

    这是一个例子:

    private void chart1_MouseClick(object sender, MouseEventArgs e)
    {
        HitTestResult hit = chart1.HitTest(e.X, e.Y, ChartElementType.DataPoint);
    
        if (hit.PointIndex >= 0 && hit.Series != null)
        {
            DataPoint dp = chart1.Series[0].Points[hit.PointIndex];
            label1.Text = "Value #" + hit.PointIndex + " = " + dp.XValue;
        }
        else label1.Text = "";
    }
    
    private void chart1_MouseMove(object sender, MouseEventArgs e)
    {
        HitTestResult hit = chart1.HitTest(e.X, e.Y);
        var dp = hit.Object as DataPoint;
        Cursor = (dp is null) ? Cursors.Default : Cursors.Hand;
    }
    

    请注意,这两个事件使用不同的方式来测试命中..!

    【讨论】:

    • 很棒的答案!但是有一个小错误:点击任何一块外部就像点击第一块一样。
    • 很有洞察力; imo 真正的错误是它没有像预期的那样将 PointIndex 设置为 -1;感谢您指出它。已更正。
    【解决方案2】:

    我喜欢接受的答案。但是这里有一种稍微不同的方法,它使用通用代码进行命中测试,并且还支持悬停和单击图例中的项目。

    private int pieHitPointIndex(Chart pie, MouseEventArgs e)
    {
        HitTestResult hitPiece = pie.HitTest(e.X, e.Y, ChartElementType.DataPoint);
        HitTestResult hitLegend = pie.HitTest(e.X, e.Y, ChartElementType.LegendItem);
        int pointIndex = -1;
        if (hitPiece.Series != null) pointIndex = hitPiece.PointIndex;
        if (hitLegend.Series != null) pointIndex = hitLegend.PointIndex;
        return pointIndex;
    }
    private void pie_MouseClick(object sender, MouseEventArgs e)
    {
        Chart pie = (Chart)sender;
        int pointIndex = pieHitPointIndex(pie, e);
        if (pointIndex >= 0)
        {
            DataPoint dp = pie.Series[0].Points[pointIndex];
            // do what you want to do with a click
        }
    }
    private void pie_MouseMove(object sender, MouseEventArgs e)
    {
        Chart pie = (Chart)sender;
        int pointIndex = pieHitPointIndex(pie, e);
        if (pointIndex >= 0)
        {
            Cursor = Cursors.Hand;
        }
        else
        {
            Cursor = Cursors.Default;
        }
    }
    

    【讨论】:

      【解决方案3】:
      public class CustomChart : Chart
      {
          public CustomChart()
          : base()
          {
              // Prevent the button from drawing its own border
              SetStyle(ControlStyles.Selectable, false);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多