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; } }