Eigenes Bedienelement



  • Hi,

    ich bin gerade dabei ein eigenes Bedienelement zu schreiben, bin auch schon recht weit, hab aber gerade 1 kleine Sache die mich stört.

    Kurz was zum Steuerelement:
    Es handelt sich um eine Tabelle, wo sich in jeder Zeile ein Panel befindet. Diese Panel soll dann über einen Knopf vergrössert/verkleinert werden.
    In den Panels sollen später weitere Bedienelemente abgelegt werden, die dann per Drag&Drop auf eine Fläche gezogen werden können.

    Das Problem:
    Wenn ich nun alle Panels 'aufklappe' wird die Tabelle grösser als Das Parent-Fenster, es wird also automatisch ein Scrollbalken angezeigt. Das ist ja soweit richtig.
    Wenn ich aber nun alle Panels wieder 'einklappe' verschwindet der Scrollbalken nicht 😕

    Hat da irgendwer eine Idee was ich machen könnte ?

    MfG
    Marco

    Hier noch der Quelltext des Steuerelments

    public class Expander : TableLayoutPanel {
        public Expander()
            : base() {
    
            /* Zum testen den RoWCount angeben später zur Laufzeit ändern */
            this.RowCount = 5;
            /* ColumnCount auf 1 setzen mehr als eine Splate soll zunächst nicht möglich sein */
            this.ColumnCount = 1;
    
            /* Hintergrundfarbe der Tabelle festlegen */
            this.BackColor = System.Drawing.Color.Gainsboro;
            /* Steuerelement wird sowohl größer als auch kleiner , funktioniert nicht richtig. WARUM ?!? */
            this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink;
            /* Passt die Tabelle nicht ins übergeordnete Fenster sollen scrollbalken eingeblendet werden. */
            /* Das ausblenden funktioniert allerdings nicht mehr */
            this.AutoScroll = true;
    
            /* Die einzigste Spalte soll das komplette Steuerelement ausfüllen. */ 
            this.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 100F));
    
            /* Die Abstände der Zeilen auf 0 setzen, rechts und links soll ein kleiner Rand zu sehen sein.*/
            this.Padding = new System.Windows.Forms.Padding(2, 0, 2, 0);
            this.Margin = new System.Windows.Forms.Padding(2, 0, 2, 0);
    
            /* Zum testen 5 Elemente einfügen */
            this.Controls.Add(new ExpanderItem("Kategorie 1"), 0, 0);
            this.RowStyles.Add(new System.Windows.Forms.RowStyle());
            this.Controls.Add(new ExpanderItem("Kategorie 2"), 0, 1);
            this.RowStyles.Add(new System.Windows.Forms.RowStyle());
            this.Controls.Add(new ExpanderItem("Kategorie 3"), 0, 2);
            this.RowStyles.Add(new System.Windows.Forms.RowStyle());
            this.Controls.Add(new ExpanderItem("Kategorie 4"), 0, 3);
            this.RowStyles.Add(new System.Windows.Forms.RowStyle());
            this.Controls.Add(new ExpanderItem("Kategorie 5"), 0, 4);
            this.RowStyles.Add(new System.Windows.Forms.RowStyle());
        }
    
        public class ExpanderItem : Panel {
            /* Kategorie auf-/zugeklappt*/
            enum status { closed = 0, opened };
            status PanelStatus = status.closed;
    
            /* Ein Button ganz oben um die Kategorie auf-/zu zuklappen*/
            Button GrowShrink = null;
    
            public ExpanderItem(String CategoryName)
                : base() {
    
                /* Button erstellen und Optik anpassen. */
                GrowShrink = new Button();
    
                /* Flacher Button Farbe wechselt nur bei Mouseover */
                GrowShrink.BackColor = System.Drawing.Color.Silver;
                GrowShrink.FlatStyle = System.Windows.Forms.FlatStyle.Flat;
                GrowShrink.FlatAppearance.BorderColor = System.Drawing.Color.White;
                GrowShrink.FlatAppearance.BorderSize = 0;
                GrowShrink.FlatAppearance.CheckedBackColor = System.Drawing.Color.Silver;
                GrowShrink.FlatAppearance.MouseOverBackColor = System.Drawing.Color.LightGray;
                GrowShrink.FlatAppearance.MouseDownBackColor = System.Drawing.Color.Silver;
                GrowShrink.Dock = System.Windows.Forms.DockStyle.Top;
                GrowShrink.Padding = new System.Windows.Forms.Padding(0);
                GrowShrink.Margin = new System.Windows.Forms.Padding(0);
    
                /* Beschriftung und Icon für den Button setzen / positioneren */
                GrowShrink.Name = CategoryName;
                GrowShrink.Text = " " + CategoryName;
                GrowShrink.Font = new System.Drawing.Font("Microsoft Sans Serif", 8.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
                GrowShrink.Image = global::DShow.VC.Properties.Resources.plus;
                GrowShrink.ImageAlign = System.Drawing.ContentAlignment.MiddleLeft;
                GrowShrink.Size = new System.Drawing.Size(200, 23);
                GrowShrink.TextImageRelation = System.Windows.Forms.TextImageRelation.ImageBeforeText;
                GrowShrink.UseVisualStyleBackColor = true;
    
                /* Click-ereigniss abfangen */
                GrowShrink.Click += new EventHandler(this.GrowShrinkHandler);
    
                /* Panel anpassen */
                this.BackColor = System.Drawing.Color.White;
                this.Size = new System.Drawing.Size(200, 23);
                this.AutoSizeMode = System.Windows.Forms.AutoSizeMode.GrowAndShrink; 
                this.Dock = System.Windows.Forms.DockStyle.Top;
                this.Controls.Add(GrowShrink);
                this.Padding = new System.Windows.Forms.Padding(0);
                this.Margin = new System.Windows.Forms.Padding(0);
            }
    
            private void GrowShrinkHandler(object sender, EventArgs e) {
                if (PanelStatus == status.closed) { // Category öffnen (Panel vergrößern)
                    /* Alle Controls im Panel durchlaufen um die Größe des Panels zu ermittel,
                     * die benötigt wird um alle Controls anzuzeigen. */
                    int maxWidth = 0, maxHeight = 0;
                    foreach (Control Component in this.Controls) {
                        maxWidth = Math.Max(maxWidth, Component.Location.X + Component.Size.Width);
                        maxHeight = Math.Max(maxWidth, Component.Location.Y + Component.Size.Height);
                    }
    
                    /* Icon ändern */
                    GrowShrink.Image = global::DShow.VC.Properties.Resources.minus;
    
                    /* Das aufklappen soll nach unten hin abgefedert werden. */
                    int SlideSteps = 20;
                    double SinSumme = 0.0;
                    for (int Step = 0; Step < SlideSteps; Step++)
                        SinSumme += Math.Sin(Math.PI / 2 / SlideSteps * Step);
    
                    int GrowingHeight = maxHeight - Height;
                    double GrowStep = GrowingHeight / SinSumme;
                    for (int Step = 0; Step < SlideSteps; Step++) {
                        Height += (int)Math.Floor(Math.Sin(Math.PI / 2 / SlideSteps * Step) * GrowStep + 0.5);
                        System.Threading.Thread.Sleep(10);
                    }
    
                    PanelStatus = status.opened;
                } else {  // Category schliessen (Panel verkleiner)
                    /* Icon ändern */
                    GrowShrink.Image = global::DShow.VC.Properties.Resources.plus;
    
                    /* Das aufklappen soll nach unten hin abgefedert werden. */
                    int SlideSteps = 20;
                    double SinSumme = 0.0;
                    for (int Step = 0; Step < SlideSteps; Step++)
                        SinSumme += Math.Sin(Math.PI / 2 / SlideSteps * Step);
    
                    int GrowingHeight = Height - GrowShrink.Height;
                    double GrowStep = GrowingHeight / SinSumme;
                    for (int Step = 0; Step < SlideSteps; Step++) {
                        Height -= (int)Math.Floor(Math.Sin(Math.PI / 2 / SlideSteps * Step) * GrowStep + 0.5);
                        System.Threading.Thread.Sleep(10);
                    }
    
                    /* diverse Versuche die Tabelle dazu zu überreden den Scrollbalken auszublenden. */
                    Height = GrowShrink.Height;
                    Parent.Height = 600;
                    Parent.Invalidate();
                    Parent.PerformLayout();
                    PanelStatus = status.closed;
                }
            }
        }
    }
    

    So wird das Bedienelement eingebunden.

    CVObjects = new Expander();
    CVObjects.Dock = System.Windows.Forms.DockStyle.Right;
    CVObjects.Location = new System.Drawing.Point(400, 23);
    CVObjects.Size = new System.Drawing.Size(200, 600);
    CVObjects.Name = "CVObjects";
    DesignerPanel.Controls.Add(this.CVObjects);
    


  • das fenster müsste eine eigenschaft haben, mit der sich der scrollbalken ein- / ausblenden lässt. schau am besten mal ins msdn


Anmelden zum Antworten