簡體   English   中英

餅圖切片點擊

[英]Pie chart slice click

我正在嘗試單擊我從 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;

是的,這是正確的方法。

您現在可以測試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;
}

請注意,這兩個事件使用不同的方式來測試命中..!

在此處輸入圖片說明

我喜歡接受的答案。 但是這里有一種稍微不同的方法,它使用通用代碼進行命中測試,並且還支持懸停和單擊圖例中的項目。

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;
    }
}
public class CustomChart : Chart
{
    public CustomChart()
    : base()
    {
        // Prevent the button from drawing its own border
        SetStyle(ControlStyles.Selectable, false);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM