C # Winforms: как получить значение, когда пользователь выбирает (щелчок мыши) точку на графике - PullRequest
0 голосов
/ 03 января 2019

enter image description here

Я хочу получить StaffId в MessageBox, когда я нажимаю, например, на точечной диаграмме Дэвида (в синей области Дэвида, как показано на рисунке).

Я имею в виду 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 голосов
/ 03 января 2019

Попробуйте событие 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);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...