Ось диаграммы MS Gantt 2

#c# #winforms #charts #controls #gantt-chart

#c# #winforms #Диаграммы #элементы управления #Диаграмма Ганта

Вопрос:

У меня была такая диаграмма Ганта. Я хотел бы показать AxisX2 со значением в процентах, которое я подготовил для формулы. У меня были проблемы с отображением AxisX2 и набором рядов для него.

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

Вот некоторые базовые функции для отображения этой диаграммы

  public void setUpGantt(Chart chart)
    {
       chart.Series.Clear();
        Series s = chart.Series.Add("sszs");

        s.ChartType = SeriesChartType.RangeBar;
        s.YValueType = ChartValueType.DateTime;
        s.ResetIsVisibleInLegend () ;
        s.IsVisibleInLegend = true;

        Axis ax = chart.ChartAreas[0].AxisX;
        Axis ay = chart.ChartAreas[0].AxisY;
        ax.MajorGrid.Enabled = false;
  
     
        ay.IntervalType = DateTimeIntervalType.Minutes;
        ay.Interval = 60;
        ay.LabelStyle.Format = "HH:mm";

      ay.Minimum = 0;
      ay.Maximum = 0.2;
        limitGantt(chart, "0:00", "24:00");
        s.ToolTip = "#VALY1{HH:mm}~#VALY2{HH:mm}";
    }
 public void limitGantt(Chart chart, string start, string end)
    {
        Axis ax = chart.ChartAreas[0].AxisX;
        Axis ay = chart.ChartAreas[0].AxisY;
        ay.Minimum = fromTimeString(start).ToOADate();  
        ay.Maximum = fromTimeString(end).ToOADate();  
    }
DateTime fromTimeString(string time)
        {
            var p = time.Split(':');
            int sec = p.Length == 3 ? Convert.ToInt16(p[2]) : 0;
            TimeSpan t = new TimeSpan(Convert.ToInt16(p[0]), Convert.ToInt16(p[1]), sec);
            return DateTime.Today.Add(t);
        }
public void addGanttTask(Series s, string start, string end, Color c, int slot, string [] array)
        {
            DateTime start_ = fromTimeString(start);
            DateTime end_ = fromTimeString(end);
            int pt = s.Points.AddXY(slot, start_, end_);
            s.Points[pt].Color = c;
            s.IsVisibleInLegend = true;

            if (array != null)
            {
                for (int i = 0; i < array.Length; i  )
                {
                    if (slot == i   1)
                    { s.Points[pt].AxisLabel = array[i];
                        
                    }
                }
            }

        }
 

Комментарий Taw

  public void setUpGantt(Chart chart)
    {
       chart.Series.Clear();
        Series s = chart.Series.Add("sszs");

        s.ChartType = SeriesChartType.RangeBar;
        s.YValueType = ChartValueType.DateTime;
        s.ResetIsVisibleInLegend () ;
        s.IsVisibleInLegend = true;

        Axis ax = chart.ChartAreas[0].AxisX;
        Axis ay = chart.ChartAreas[0].AxisY;
        ax.MajorGrid.Enabled = false;
  
 Axis ax2 = chart.ChartAreas[0].AxisX2; 
                ax2.Enabled = AxisEnabled.True;
                ax2.Maximum = 100; 
                ax2.MajorGrid.Enabled = false;

        ay.IntervalType = DateTimeIntervalType.Minutes;
        ay.Interval = 60;
        ay.LabelStyle.Format = "HH:mm";

      ay.Minimum = 0;
      ay.Maximum = 0.2;
        limitGantt(chart, "0:00", "24:00");
        s.ToolTip = "#VALY1{HH:mm}~#VALY2{HH:mm}";
    }
 

Я бы хотел, чтобы процентное значение = зеленое время / Общее время (от 00:
от 00 до текущего времени) пример

Комментарии:

1. Это отличная диаграмма. @Mehdi LAMRANI может вам помочь

2. Просто включите вторичную ось, отключите основные строки и установите минимум и максимум! Пример: Axis ax2 = chart.ChartAreas[0].AxisX2; axy2.Enabled = AxisEnabled.True; axy2.Maximum = 100; axy2.MajorGrid.Enabled = false; — Однако обратите внимание, что в вашем примере сетки расположены на одинаковом расстоянии, а проценты — нет! Чтобы действительно отображать метки с произвольным интервалом, вам понадобятся пользовательские метки

3. @TaW Ты имеешь в виду, что axy2 — это ax2, не так ли? Как вы сказали, отобразить проценты непросто. У вас есть какие-либо подробные предложения?. Спасибо

4. Упс, да, опечатка, все они должны называться ax2. — Не уверен, что именно вы хотите в качестве содержимого метки. В моем примере создаются автоматические метки от 0 до 100. Существует два способа создания пользовательских значений. Являются ли те, которые вы показываете, теми, которые вам нужны? Что они означают? Проценты не от x, а от y-значений?? Для этого вам действительно нужны пользовательские метки.

5. Хорошо, хотя я не вижу ярлыков axis2 на изображении, которое вы показываете, я думаю, я понимаю, что вам все равно понадобятся пользовательские метки, поскольку вы хотите показать LabelTexts, которые не связаны со значениями оси. Пользовательские метки немного сложны, но на самом деле не сложны. Вы должны написать цикл над значениями x и создать по одному CL для каждого. Вы бы добавили их на вторичную ось. Сложная часть заключается в настройке местоположения; для этого установите From- и ToPosition на «немного» меньше и больше, чем фактическое положение. Вы можете задать любой текст и другие вещи..

Ответ №1:

Спасибо за предложение TaW. Это сработало для меня. Я публикую здесь, чтобы поделиться, кто хочет знать

  public void setUpGantt(Chart chart)
{
   chart.Series.Clear();
    Series s = chart.Series.Add("sszs");

    s.ChartType = SeriesChartType.RangeBar;
    s.YValueType = ChartValueType.DateTime;
    s.ResetIsVisibleInLegend () ;
    s.IsVisibleInLegend = true;

    Axis ax = chart.ChartAreas[0].AxisX;
    Axis ay = chart.ChartAreas[0].AxisY;
    ax.MajorGrid.Enabled = false;
  
      Axis ax2 = chart.ChartAreas[0].AxisX2; 
       ax2.Enabled = AxisEnabled.True;
       ax2.MajorGrid.Enabled = true;
       ax2.CustomLabels.Clear();// clear previous value when switch another data
        for (int i = 0; i < 12; i  )
        {
            CustomLabel cl = new CustomLabel();
            cl.FromPosition = i 0.5;   
            cl.ToPosition = i 1.5;  
            cl.Text = i " %";   // example value to show on CustomLabel
            ax2.CustomLabels.Add(cl);
        }

    ay.IntervalType = DateTimeIntervalType.Minutes;
    ay.Interval = 60;
    ay.LabelStyle.Format = "HH:mm";

  ay.Minimum = 0;
  ay.Maximum = 0.2;
    limitGantt(chart, "0:00", "24:00");
    s.ToolTip = "#VALY1{HH:mm}~#VALY2{HH:mm}";
}
 

Основной скрипт для отображения еще одной оси с пользовательской меткой

 Axis ax2 = chart.ChartAreas[0].AxisX2; 
           ax2.Enabled = AxisEnabled.True;
           ax2.MajorGrid.Enabled = true;
           ax2.CustomLabels.Clear();// clear previous value when switch another data
            for (int i = 0; i < 12; i  )
            {
                CustomLabel cl = new CustomLabel();
                cl.FromPosition = i 0.5;   
                cl.ToPosition = i 1.5;  
                cl.Text = i " %";   // example value to show on CustomLabel
                ax2.CustomLabels.Add(cl);
            }