public ClusterControlDetailed(MainForm form, Cluster cluster)
        {
            if (cluster == null)
                throw new ArgumentNullException(nameof(cluster));

            this.Form = form;

            InitializeComponent();

            const int padding = 2; // Abstand zwischen zwei StepperControls
            int height = 0;

            steppers = new StepperControl[Cluster.Width * Cluster.Height];

            // im folgenden wird über X und Y Koordinaten eine Tabelle erzeugt
            for (int y = 0; y < Cluster.Height; y++)
            {
                Label labelRow = new Label();
                labelRow.Text = (Cluster.Height - y).ToString();
                labelRow.AutoSize = true;
                steppersPanel.Controls.Add(labelRow);

                for (int x = 0; x < Cluster.Width; x++)
                {
                    StepperControl stepper = new StepperControl(cluster.GetStepperByPosition(x, Cluster.Height - 1 - y));
                    steppersPanel.Controls.Add(stepper);

                    steppers[y * Cluster.Width + x] = stepper;

                    Label labelColumn = new Label();
                    labelColumn.Text = (x + 1).ToString();
                    labelColumn.AutoSize = true;
                    steppersPanel.Controls.Add(labelColumn);
                    labelColumn.Location = new Point(x * (stepper.Width + padding) + labelRow.Width + stepper.Width / 2 - labelColumn.Width / 2, 0);

                    stepper.Location = new Point(x * (stepper.Width + padding) + labelRow.Width, y * (stepper.Height + padding) + labelColumn.Height);
                    stepper.Click += (sender, e) =>
                    {
                        ShowStepper((StepperControl)sender);
                    };
                    height = stepper.Height + padding;
                }

                labelRow.Location = new Point(0, y * height + height / 2 - labelRow.Height / 2);
            }

            ShowCluster(cluster);
        }
        public void ShowCluster(Cluster cluster)
        {
            if (cluster == null)
                throw new ArgumentNullException(nameof(cluster));

            if (CurrentCluster == cluster)
                return;

            // UI zurücksetzen
            ActiveControl = null;
            ShowStepper(null);
            ResetCurrentCluster();

            CurrentCluster = cluster;

            // neue UI zeigen
            for (int x = 0; x < Cluster.Width; x++)
                for (int y = 0; y < Cluster.Height; y++)
                    steppers[y * Cluster.Width + x].ShowStepper(CurrentCluster.GetStepperByPosition(x, Cluster.Height - 1 - y));
            UpdateClusterBox(cluster, EventArgs.Empty);

            // Events setzen
            cluster.OnPingChange += UpdateClusterBox;
            cluster.OnInfoChange += UpdateClusterBox;

            UpdateClusterHeight();
        }