Laden...

Eigene Klasse, die von "Panel" erbt, zeigt Elemente erst an, wenn man auf ihre Position klickt

Erstellt von ExclusivAtom vor 7 Jahren Letzter Beitrag vor 7 Jahren 1.266 Views
E
ExclusivAtom Themenstarter:in
48 Beiträge seit 2015
vor 7 Jahren
Eigene Klasse, die von "Panel" erbt, zeigt Elemente erst an, wenn man auf ihre Position klickt

Guten abend,
unten seht ihr ein Bild, wie mein Chat dargestellt wird.
"Player" ist ein Button Steuerelement.
Darunter eine Listbox, die Eingabe ist eine RichTextBox und der Pfeil ist auch ein Button.
Die Elemente sind alle auf einem Panel.

Ich wollte das Layout des Chats halt öfter erstellen, also habe ich eine neue Klasse erstellt und vom Panel geerbt.
Hier seht ihr einmal die Klasse:


public class PanelChat : Panel
    {
        Button btnPlayerName, btnChatSend;
        ListBox lbChat;
        RichTextBox rtbChat;

        public PanelChat(int ChatCount, string Player)
        {
            btnPlayerName = new Button();
            btnChatSend = new Button();
            lbChat = new ListBox();
            rtbChat = new RichTextBox();
            btnPlayerName.Name = "btnPlayerName" + Convert.ToString(ChatCount + 1);
            btnPlayerName.Text = Player;
            lbChat.Name = "lbChat" + Convert.ToString(ChatCount + 1);
            rtbChat.Name = "rtbChat" + Convert.ToString(ChatCount + 1);
            btnChatSend.Name = "btnChatSend" + Convert.ToString(ChatCount + 1);
        }

        protected override void OnPaint(PaintEventArgs e)
        {
            this.Size = new Size(200, 371);
            base.OnPaint(e);        
            ///btnPlayerName
            this.btnPlayerName.BackColor = System.Drawing.Color.RoyalBlue;
            this.btnPlayerName.Font = new System.Drawing.Font("Arial", 12F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            this.btnPlayerName.ForeColor = System.Drawing.Color.White;
            this.btnPlayerName.Location = new System.Drawing.Point(0, 0);
            this.btnPlayerName.Name = "btnPlayerName";
            this.btnPlayerName.Size = new System.Drawing.Size(200, 36);
            this.btnPlayerName.TabIndex = 13;
            this.btnPlayerName.TextAlign = System.Drawing.ContentAlignment.MiddleLeft;
            this.btnPlayerName.UseVisualStyleBackColor = false;
            /////lbChat
            this.lbChat.FormattingEnabled = true;
            this.lbChat.ItemHeight = 18;
            this.lbChat.Location = new System.Drawing.Point(0, 36);
            this.lbChat.ScrollAlwaysVisible = true;
            this.lbChat.Size = new System.Drawing.Size(200, 238);
            this.lbChat.TabIndex = 10;
            /////rtbChat
            this.rtbChat.Location = new System.Drawing.Point(0, 274);
            this.rtbChat.Size = new System.Drawing.Size(162, 96);
            this.rtbChat.TabIndex = 11;
            this.rtbChat.Text = "";
            /////btnChatSend
            this.btnChatSend.BackColor = System.Drawing.Color.RoyalBlue;
            this.btnChatSend.BackgroundImage = Skat.Properties.Resources.long_arrow_right;
            this.btnChatSend.BackgroundImageLayout = System.Windows.Forms.ImageLayout.Zoom;
            this.btnChatSend.Location = new System.Drawing.Point(160, 274);
            this.btnChatSend.Size = new System.Drawing.Size(40, 96);
            this.btnChatSend.TabIndex = 12;
            this.btnChatSend.UseVisualStyleBackColor = false;
            this.Controls.Add(rtbChat);
            this.Controls.Add(btnPlayerName);
            this.Controls.Add(lbChat);
            this.Controls.Add(btnChatSend);
        }
    }

Mein Problem, es wird nur die ListBox und die RichTextBox angezeigt.
Wenn ich auf der Form dann auf die beiden Buttons drücke, wo sie eigentlich sind, erscheinen sie.
In der RichTextBox kann ich nichts schreiben.
Hatte die RTB ebend mit einer normalen TextBox ausgetauscht.
Ich konnte zwar was schreiben, es wurde aber nicht angezeigt, weil es die ganze Zeit neu gezeichnet wird?

Wenn ich beispielweise nur den Button "btnPlayerName" und die ListBox "lbChat" hinzufüge, sieht man die beiden direkt. Aber sobald die RTB hinzukommt, funktioniert es nicht mehr richtig.

D
261 Beiträge seit 2015
vor 7 Jahren

Kann es sein, dass du die RichTextbox als letztes hinzufügst und diese somit deine Buttons verdeckt?
Ruf das Controls.Add für die RichTextbox mal vor den anderen Sachen auf.

E
ExclusivAtom Themenstarter:in
48 Beiträge seit 2015
vor 7 Jahren

Das macht keinen Unterschied.

W
196 Beiträge seit 2008
vor 7 Jahren

OnPaint ist der vollkommen falsche Ort um Controls hinzuzufügen. Schau Dir die Dokumentation zu OnPaint an...

Warum verlagerst Du den Code, den Du im OnPaint hast nicht einfache ebenfalls in Deinen Constructor?

E
ExclusivAtom Themenstarter:in
48 Beiträge seit 2015
vor 7 Jahren

Ja weiß ich auch nich. Danke es funktioniert^^