Inhalt

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

ProfileDetailForm.cs

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

namespace Duesk.Forms;

public partial class ProfileDetailForm : Form
{
    private Profile _profile;
    private TabControl tabControl;
    private RadioButton rbHs;
    private RadioButton rbFs;
    private DataGridView dgvSe;
    private DataGridView dgvFe;
    private DataGridView dgvItems;
    private Chart chartSe;
    private Chart chartFe;
    private Chart chartStats;
    private Label lblCorrelation;
    private Label lblAgreement;
    private TextBox txtInterpretation;
    
    private int[] _seValues = new int[6];
    private int[] _feValues = new int[6];
    private string _currentNorm = "HS";
    
    public ProfileDetailForm(Profile profile)
    {
        _profile = profile;
        InitializeComponent();
        Calculate();
    }
    
    private void InitializeComponent()
    {
        this.Text = $"Profil: {_profile.Name}";
        this.Size = new Size(1100, 800);
        this.StartPosition = FormStartPosition.CenterParent;
        
        // Top Panel mit Name und Normauswahl
        var topPanel = new Panel { Dock = DockStyle.Top, Height = 60, Padding = new Padding(10) };
        var lblName = new Label
        {
            Text = $"Name: {_profile.Name}",
            Font = new Font("Segoe UI", 14, FontStyle.Bold),
            Location = new Point(10, 15),
            AutoSize = true
        };
        
        var normPanel = new Panel { Location = new Point(300, 10), Size = new Size(250, 40) };
        rbHs = new RadioButton { Text = "Hauptschule (HS)", Location = new Point(0, 10), Checked = true };
        rbFs = new RadioButton { Text = "Förderschule (FS)", Location = new Point(120, 10) };
        rbHs.CheckedChanged += (s, e) => { _currentNorm = "HS"; Calculate(); };
        rbFs.CheckedChanged += (s, e) => { _currentNorm = "FS"; Calculate(); };
        normPanel.Controls.Add(rbHs);
        normPanel.Controls.Add(rbFs);
        
        topPanel.Controls.Add(lblName);
        topPanel.Controls.Add(normPanel);
        
        // TabControl
        tabControl = new TabControl { Dock = DockStyle.Fill };
        
        // SE Tab
        var tabSe = new TabPage("SelbsteinschÀtzung");
        dgvSe = CreateCompetenceTable();
        chartSe = CreateChart();
        tabSe.Controls.Add(chartSe);
        tabSe.Controls.Add(dgvSe);
        tabControl.TabPages.Add(tabSe);
        
        // FE Tab
        var tabFe = new TabPage("FremdeinschÀtzung");
        dgvFe = CreateCompetenceTable();
        chartFe = CreateChart();
        tabFe.Controls.Add(chartFe);
        tabFe.Controls.Add(dgvFe);
        tabControl.TabPages.Add(tabFe);
        
        // Statistik Tab
        var tabStats = new TabPage("Statistik");
        chartStats = CreateChart();
        chartStats.Size = new Size(1050, 300);
        chartStats.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
        
        var statsPanel = new Panel { Location = new Point(10, 320), Size = new Size(1050, 100) };
        lblCorrelation = new Label { Font = new Font("Segoe UI", 12, FontStyle.Bold), AutoSize = true };
        lblAgreement = new Label { Font = new Font("Segoe UI", 12, FontStyle.Bold), AutoSize = true, Location = new Point(0, 30) };
        statsPanel.Controls.Add(lblCorrelation);
        statsPanel.Controls.Add(lblAgreement);
        
        txtInterpretation = new TextBox
        {
            Location = new Point(10, 430),
            Size = new Size(1050, 200),
            Multiline = true,
            ReadOnly = true,
            ScrollBars = ScrollBars.Vertical,
            WordWrap = true
        };
        
        tabStats.Controls.Add(txtInterpretation);
        tabStats.Controls.Add(statsPanel);
        tabStats.Controls.Add(chartStats);
        tabControl.TabPages.Add(tabStats);
        
        // Items Tab
        var tabItems = new TabPage("Alle Items");
        dgvItems = CreateItemsTable();
        tabItems.Controls.Add(dgvItems);
        tabControl.TabPages.Add(tabItems);
        
        // Close Button
        var closeBtn = new Button
        {
            Text = "Schließen",
            Size = new Size(100, 35),
            Location = new Point(500, 730),
            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(tabControl);
        this.Controls.Add(topPanel);
    }
    
    private DataGridView CreateCompetenceTable()
    {
        var dgv = new DataGridView
        {
            Dock = DockStyle.Top,
            Height = 200,
            AllowUserToAddRows = false,
            ReadOnly = true,
            RowHeadersWidth = 120,
            AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
        };
        
        dgv.ColumnCount = 6;
        dgv.Columns[0].HeaderText = "Kompetenz";
        for (int i = 1; i <= 5; i++) dgv.Columns[i].HeaderText = i.ToString();
        
        dgv.Rows.Add(Norms.Kompetenzen.Length);
        for (int i = 0; i < Norms.Kompetenzen.Length; i++)
        {
            dgv.Rows[i].Cells[0].Value = Norms.Kompetenzen[i];
        }
        
        return dgv;
    }
    
    private DataGridView CreateItemsTable()
    {
        var dgv = new DataGridView
        {
            Dock = DockStyle.Fill,
            AllowUserToAddRows = false,
            ReadOnly = true,
            AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
        };
        
        dgv.ColumnCount = 3;
        dgv.Columns[0].HeaderText = "Item";
        dgv.Columns[1].HeaderText = "SE";
        dgv.Columns[2].HeaderText = "FE";
        
        dgv.Rows.Add(36);
        for (int i = 0; i < 36; i++)
        {
            dgv.Rows[i].Cells[0].Value = $"{i + 1}. {Norms.Items[i]}";
            dgv.Rows[i].Cells[1].Value = _profile.GetItem(i + 1);
            dgv.Rows[i].Cells[2].Value = _profile.GetFeItem(i + 1);
        }
        
        return dgv;
    }
    
    private Chart CreateChart()
    {
        var chart = new Chart
        {
            Dock = DockStyle.Fill,
            Height = 300
        };
        
        var chartArea = new ChartArea();
        chart.ChartAreas.Add(chartArea);
        
        return chart;
    }
    
    private void Calculate()
    {
        // Items extrahieren
        int[] seItems = new int[36];
        int[] feItems = new int[36];
        for (int i = 1; i <= 36; i++)
        {
            seItems[i - 1] = _profile.GetItem(i);
            feItems[i - 1] = _profile.GetFeItem(i);
        }
        
        // Summen berechnen
        int[] seSums = Calculator.CalculateSums(seItems);
        int[] feSums = Calculator.CalculateSums(feItems);
        
        // Normen auswÀhlen
        double[,] normSE, normFE;
        if (_currentNorm == "HS")
        {
            normSE = Norms.NormSeHs;
            normFE = Norms.NormFeHs;
        }
        else
        {
            normSE = Norms.NormSeFs;
            normFE = Norms.NormFeFs;
        }
        
        // Profilwerte berechnen
        _seValues = Calculator.CalculateProfileValues(seSums, normSE);
        _feValues = Calculator.CalculateProfileValues(feSums, normFE);
        
        // Tabellen aktualisieren
        UpdateCompetenceTable(dgvSe, _seValues);
        UpdateCompetenceTable(dgvFe, _feValues);
        
        // Diagramme aktualisieren
        UpdateChart(chartSe, _seValues, "SelbsteinschÀtzung");
        UpdateChart(chartFe, _feValues, "FremdeinschÀtzung");
        UpdateComparisonChart();
        
        // Statistik
        double correlation = Calculator.CalculateCorrelation(_seValues, _feValues);
        double agreement = Calculator.CalculateAgreement(seItems, feItems);
        
        lblCorrelation.Text = $"Korrelation: {correlation:F2}";
        lblAgreement.Text = $"Übereinstimmung: {agreement:F1}%";
        
        // Interpretation
        var sb = new System.Text.StringBuilder();
        sb.AppendLine($"Die Korrelation von {correlation:F2} bedeutet: ");
        if (correlation >= 0.8) sb.AppendLine("  Sehr gute Übereinstimmung zwischen Selbst- und FremdeinschĂ€tzung.\n");
        else if (correlation >= 0.5) sb.AppendLine("  MĂ€ĂŸige Übereinstimmung zwischen Selbst- und FremdeinschĂ€tzung.\n");
        else if (correlation >= 0.3) sb.AppendLine("  Schwache Übereinstimmung zwischen Selbst- und FremdeinschĂ€tzung.\n");
        else sb.AppendLine("  Keine signifikante Übereinstimmung zwischen Selbst- und FremdeinschĂ€tzung.\n");
        
        sb.AppendLine("Auswertung der Kompetenzen:");
        sb.AppendLine(new string('-', 50));
        sb.AppendLine("SelbsteinschÀtzung:");
        for (int i = 0; i < 6; i++)
        {
            sb.AppendLine($"  ‱ {Norms.Kompetenzen[i]}: {Calculator.GetRating(_seValues[i] + 1)}");
        }
        sb.AppendLine();
        sb.AppendLine("FremdeinschÀtzung:");
        for (int i = 0; i < 6; i++)
        {
            sb.AppendLine($"  ‱ {Norms.Kompetenzen[i]}: {Calculator.GetRating(_feValues[i] + 1)}");
        }
        txtInterpretation.Text = sb.ToString();
    }
    
    private void UpdateCompetenceTable(DataGridView dgv, int[] values)
    {
        for (int i = 0; i < 6; i++)
        {
            for (int j = 1; j <= 5; j++)
            {
                dgv.Rows[i].Cells[j].Value = (values[i] == j - 1) ? "X" : "";
            }
        }
    }
    
    private void UpdateChart(Chart chart, int[] values, string title)
    {
        chart.Series.Clear();
        var series = new Series(title)
        {
            ChartType = SeriesChartType.Line,
            BorderWidth = 2,
            MarkerSize = 8,
            MarkerStyle = MarkerStyle.Circle
        };
        
        for (int i = 0; i < 6; i++)
        {
            series.Points.AddXY(i + 1, values[i] + 1);
        }
        
        chart.Series.Add(series);
        chart.ChartAreas[0].AxisX.Title = "Kompetenz";
        chart.ChartAreas[0].AxisY.Title = "Wert (1-5)";
        chart.ChartAreas[0].AxisX.Minimum = 1;
        chart.ChartAreas[0].AxisX.Maximum = 6;
        chart.ChartAreas[0].AxisY.Minimum = 1;
        chart.ChartAreas[0].AxisY.Maximum = 5;
    }
    
    private void UpdateComparisonChart()
    {
        chartStats.Series.Clear();
        
        var seSeries = new Series("SelbsteinschÀtzung (SE)")
        {
            ChartType = SeriesChartType.Line,
            BorderWidth = 2,
            Color = Color.Blue,
            MarkerSize = 8,
            MarkerStyle = MarkerStyle.Circle
        };
        
        var feSeries = new Series("FremdeinschÀtzung (FE)")
        {
            ChartType = SeriesChartType.Line,
            BorderWidth = 2,
            Color = Color.Red,
            MarkerSize = 8,
            MarkerStyle = MarkerStyle.Circle
        };
        
        for (int i = 0; i < 6; i++)
        {
            seSeries.Points.AddXY(i + 1, _seValues[i] + 1);
            feSeries.Points.AddXY(i + 1, _feValues[i] + 1);
        }
        
        chartStats.Series.Add(seSeries);
        chartStats.Series.Add(feSeries);
        chartStats.ChartAreas[0].AxisX.Title = "Kompetenz";
        chartStats.ChartAreas[0].AxisY.Title = "Wert (1-5)";
        chartStats.ChartAreas[0].AxisX.Minimum = 1;
        chartStats.ChartAreas[0].AxisX.Maximum = 6;
        chartStats.ChartAreas[0].AxisY.Minimum = 1;
        chartStats.ChartAreas[0].AxisY.Maximum = 5;
    }
}