Inhalt

Aktueller Ordner: duesseldorfer-schuelerinventar-csharp-client/Duesk/Forms
⬅ Übergeordnet

TimeSeriesForm.cs

using System.Windows.Forms.DataVisualization.Charting;
using Duesk.Api.Models;
using Duesk.Utils;

namespace Duesk.Forms;

public partial class TimeSeriesForm : Form
{
    private List<Profile> _profiles;
    private string _groupName;
    private ComboBox cboCompetence;
    private Chart chart;
    private DataGridView dgvData;
    
    private List<int[]> _competenceValues = new List<int[]>();
    private List<string> _profileNames = new List<string>();
    
    public TimeSeriesForm(List<Profile> profiles, string groupName)
    {
        _profiles = profiles;
        _groupName = groupName;
        InitializeComponent();
        CalculateAllProfiles();
        UpdateChart();
    }
    
    private void InitializeComponent()
    {
        this.Text = $"Zeitreihe - {_groupName}";
        this.Size = new Size(1000, 700);
        this.StartPosition = FormStartPosition.CenterParent;
        
        // Top Panel mit ComboBox
        var topPanel = new Panel { Dock = DockStyle.Top, Height = 50, Padding = new Padding(10) };
        var lblComp = new Label { Text = "Kompetenz:", Location = new Point(10, 15), Size = new Size(80, 25) };
        cboCompetence = new ComboBox
        {
            Location = new Point(100, 12),
            Size = new Size(200, 25),
            DropDownStyle = ComboBoxStyle.DropDownList
        };
        foreach (var comp in Norms.Kompetenzen)
        {
            cboCompetence.Items.Add(comp);
        }
        cboCompetence.SelectedIndex = 0;
        cboCompetence.SelectedIndexChanged += (s, e) => UpdateChart();
        
        topPanel.Controls.Add(lblComp);
        topPanel.Controls.Add(cboCompetence);
        
        // SplitContainer
        var splitContainer = new SplitContainer
        {
            Dock = DockStyle.Fill,
            Orientation = Orientation.Horizontal
        };
        
        // Chart
        chart = new Chart { Dock = DockStyle.Fill };
        var chartArea = new ChartArea();
        chart.ChartAreas.Add(chartArea);
        splitContainer.Panel1.Controls.Add(chart);
        
        // DataGridView
        dgvData = new DataGridView
        {
            Dock = DockStyle.Fill,
            AllowUserToAddRows = false,
            ReadOnly = true,
            AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
        };
        dgvData.ColumnCount = 8;
        dgvData.Columns[0].HeaderText = "Nr.";
        dgvData.Columns[1].HeaderText = "Name";
        for (int i = 0; i < 6; i++)
        {
            dgvData.Columns[i + 2].HeaderText = Norms.Kompetenzen[i];
        }
        
        splitContainer.Panel2.Controls.Add(dgvData);
        
        // Close Button
        var closeBtn = new Button
        {
            Text = "Schließen",
            Size = new Size(100, 35),
            Location = new Point(450, 660),
            Anchor = AnchorStyles.Bottom,
            BackColor = Color.FromArgb(102, 153, 204),
            ForeColor = Color.White,
            FlatStyle = FlatStyle.Flat
        };
        closeBtn.Click += (s, e) => Close();
        
        this.Controls.Add(closeBtn);
        this.Controls.Add(splitContainer);
        this.Controls.Add(topPanel);
    }
    
    private void CalculateAllProfiles()
    {
        foreach (var profile in _profiles)
        {
            // Items extrahieren
            int[] seItems = new int[36];
            for (int i = 1; i <= 36; i++)
            {
                seItems[i - 1] = profile.GetItem(i);
            }
            
            // Summen berechnen
            int[] sums = Calculator.CalculateSums(seItems);
            
            // Profilwerte berechnen (mit HS-Normen)
            int[] values = Calculator.CalculateProfileValues(sums, Norms.NormSeHs);
            
            // Auf 1-5 skalieren
            int[] scaledValues = new int[6];
            for (int i = 0; i < 6; i++)
            {
                scaledValues[i] = values[i] + 1;
            }
            
            _competenceValues.Add(scaledValues);
            _profileNames.Add(profile.Name ?? "Unbekannt");
        }
        
        // DataGridView füllen
        for (int i = 0; i < _profiles.Count; i++)
        {
            dgvData.Rows.Add();
            dgvData.Rows[i].Cells[0].Value = i + 1;
            dgvData.Rows[i].Cells[1].Value = _profileNames[i];
            for (int j = 0; j < 6; j++)
            {
                dgvData.Rows[i].Cells[j + 2].Value = _competenceValues[i][j];
            }
        }
    }
    
    private void UpdateChart()
    {
        int compIndex = cboCompetence.SelectedIndex;
        chart.Series.Clear();
        
        var series = new Series(Norms.Kompetenzen[compIndex])
        {
            ChartType = SeriesChartType.Line,
            BorderWidth = 3,
            MarkerSize = 8,
            MarkerStyle = MarkerStyle.Circle,
            Color = Color.Blue
        };
        
        for (int i = 0; i < _competenceValues.Count; i++)
        {
            series.Points.AddXY(i + 1, _competenceValues[i][compIndex]);
        }
        
        chart.Series.Add(series);
        chart.ChartAreas[0].AxisX.Title = "Profile";
        chart.ChartAreas[0].AxisY.Title = "Wert (1-5)";
        chart.ChartAreas[0].AxisY.Minimum = 1;
        chart.ChartAreas[0].AxisY.Maximum = 5;
    }
}