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