RangeChart Ось, повторяющая данные - PullRequest
0 голосов
/ 03 октября 2018

Согласно изображению, я хотел бы, чтобы записи, которые одинаковы, были в одной строке, а не были разделены.Я думаю, что мне нужно создавать разные серии для каждой записи, но, будучи новичком в этом, я понятия не имею, как это сделать.Пока что у меня есть одна серия, созданная, как показано на рисунке.Если бы вы могли помочь мне с некоторым кодом, это было бы очень признательно.Вот код, который у меня есть:

private void LoadChartData()
    {
        var s = new Series();
        s.ChartType = SeriesChartType.RangeBar;

        chart1.Series.Clear();
        chart1.Series.Add(s);

        s.SetCustomProperty("PixelPointWidth", "25");

        chart1.Series[0].YValueType = ChartValueType.DateTime;
        chart1.ChartAreas[0].AxisY.LabelStyle.Format = "yyyy-MM-dd";
        chart1.ChartAreas[0].AxisY.Interval = 1;
        chart1.ChartAreas[0].AxisY.IntervalType = DateTimeIntervalType.Days;
        chart1.ChartAreas[0].AxisY.IntervalOffset = 1;

        chart1.Series[0].XValueType = ChartValueType.String;
        chart1.ChartAreas[0].AxisY.Minimum = minDate.ToOADate();
        chart1.ChartAreas[0].AxisY.Maximum = maxDate.ToOADate();

        ConnectionStringSettings conSettings = ConfigurationManager.ConnectionStrings["shopmanagerConnectionString1"];
        MySqlConnection con = new MySqlConnection(conSettings.ToString());
        MySqlCommand cmd = new MySqlCommand(@"select * from shopmanager.planning;", con);
        MySqlDataReader myReader;
        try
        {
            con.Open();
            myReader = cmd.ExecuteReader();

            while (myReader.Read())
            {
                //check if machine is "en attente"
                string notPlanned;
                notPlanned = myReader.GetString("machine_name");
                if(notPlanned == "En attente")
                {
                    return;
                }
                else
                {
                    s.LabelForeColor = Color.Black;
                    s.Font = new System.Drawing.Font("Arial", 10f);
                    var start_date = myReader.GetDateTime("predicted_start_date");
                    var predicted_finish_date = myReader.GetDateTime("predicted_delivery");
                    var machine = myReader.GetString("machine_name");
                    int pix = s.Points.AddXY(machine, start_date, predicted_finish_date);
                    s.Points[pix].Label = myReader.GetString("project_number") + " " + myReader.GetString("part_name");
                }
            }
            cmd.Parameters.Clear();
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
        con.Close();

    }

enter image description here

1 Ответ

0 голосов
/ 03 октября 2018

Ваша проблема связана с добавлением x-значений в виде строк .Это распространенная ошибка, тем более что сначала все выглядит хорошо.Кроме того, поскольку иногда просто не имеет числовых значений ;ваши машины имеют имена, города не являются числами, а идентификаторы могут быть или не быть числовыми.Имена людей никогда не бывают и т. Д., Поэтому есть много причин, по которым можно добавлять нечисловые значения x.

Но они добавляются только к автоматическим меткам, все действительные значения x равны 0 и, следовательно, не могут быть правильно сгруппированы или использованы для других целей.Это может или не может быть проблемой.Вам нужно сгруппировать, так что здесь это проблема!

Итак, если у вас нет номеров, которые вы можете использовать, вы должны сделать несколько .

Вот пример, который вставляет все (новые) имена в Dictionary как Keys и добавляет их индекс в виде числа Value:

// maybe best at class level
Dictionary<string, int> machines = new Dictionary<string, int>();


// your reading loop here..
   ..
   string machine = ..// your retrieval code here
   if (!machines.ContainsKey(machine) ) machines.Add(machine, machines.Count);
   // now add the point:
   int px = yourSeries.Points.AddXY(machines[machine], yourYvalue1, yourYvalue2);
   yourSeries.Points[px].AxisLabel = machine;
   ..
// loopend
...