Inhalt
Aktueller Ordner:
duesseldorfer-schuelerinventar-csharp-client/Duesk/FormsProfileDetailForm.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;
}
}