C#Winforms:当用户选择(鼠标单击)图表上的点时如何获得价值

时间:2019-01-03 09:24:12

标签: c# winforms charts

enter image description here

例如,当我单击David点图时(如图所示,在David的蓝色区域),我想在MessageBox上获得StaffId

我是指点击的员工姓名中的StaffId

这是我的系列演讲。

var series = chart1.Series.Add("Series1");
series.XValueMember = "StaffId";
series.YValueMembers = "Total";
series.Name = "Employee";

和我正在使用的Linq查询

var result = (from u in db.Transactions
              join st in db.Users on u.StaffId equals st.UserId
              group u by u.Users.FirstName into g
              select new
              {
                  StaffId = g.Key,
                  Total = g.Count() 
              }).ToList();

chart1.DataSource = result;     
chart1.DataBind();
chart1.Show();

我尝试过这种方法,但是不起作用

private void chart1_MouseClick(object sender, MouseEventArgs e)
{
    // Totally stop here .. ;)       
}

1 个答案:

答案 0 :(得分:1)

尝试MouseUp事件:

private void chart1_MouseUp(object sender, MouseEventArgs e)
{
    var pointEndX = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);
    var pointEndY = chart1.ChartAreas[0].AxisY.PixelPositionToValue(e.Y);
}

因此完整的代码如下:

public partial class Form1 : Form
{
    class User
    {
        public string StaffId { get; set; }
        public int Total { get; set; }

    }
    public Form1()
    {
        InitializeComponent();
        chart1.Series.Clear();

        var series = chart1.Series.Add("Series1");
        series.XValueMember = "StaffId";
        series.YValueMembers = "Total";
        series.Name = "Employee";

        var users = new List<User>();
        users.Add(new User(){StaffId = "John", Total = 70});
        users.Add(new User() { StaffId = "David", Total = 81 });
        users.Add(new User() { StaffId = "Sara", Total = 81 });

        chart1.DataSource = users;
        chart1.DataBind();
        chart1.Show();
    }

    private void chart1_MouseUp(object sender, MouseEventArgs e)
    {
        var pointEndX = chart1.ChartAreas[0].AxisX.PixelPositionToValue(e.X);

        var list = (List<User>)chart1.DataSource;

        //round to the nearest whole number
        pointEndX = Math.Round(pointEndX, 0);

        //subtract 1 because bars start at 1 and List/Array are 0 indexed
        int index = ((int)pointEndX )- 1;

        if(index <0 || index>=list.Count)
            return;

        var user = list[index];
        MessageBox.Show(user.StaffId);
    }
}