Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
AutoScroll-Property des Panels hebelt SuspendLayout/ResumeLayout aus
_Bugrick_
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

AutoScroll-Property des Panels hebelt SuspendLayout/ResumeLayout aus

beantworten | zitieren | melden

Hallo zusammen,

ich arbeite an einem umfangreichen UserControl, das dynamisch eine Oberfläche mit ziemlich vielen Controls aufbaut.

Im Grunde funktioniert auch alles einwandfrei, bis auf einen ziemlich nervigen Schönheitsfehler.

Damit sich das UserControl sauber ohne Flackern aufbaut und dann eingeblendet wird, arbeite ich mit


this.SuspendLayout();
this.ResumeLayout();

Das funktioniert auch bei allen Controls wunderbar, bis auf einem einzigen. Nämlich einem Panel. Und auch nur dann nicht, wenn ich die AutoScroll-Property auf true setze. Kommentier ich diese Zeile aus, baut sich alles sauber auf. Sobald ich die Zeile rein nehme, ist kurz folgendes zu sehen (sh. Anhang 1).

Ist das ein Bug im .NET-Framework oder mache ich etwas falsch?

Was ich schon probiert habe ist:
- Autoscroll an verschiedenen anderen Stelle zu setzen, auch nach ResumeLayout
- Ebenfalls mit SuspendLayout and ResumeLayout für das Panel zu arbeiten


//Panels um scrollen zu können
//pnl[a].AutoScroll = true;
pnl[a].Controls.Add(tlp[a]);                   
pnl[a].Dock = DockStyle.Fill;
pnl[a].Location = new Point(0, 0);
pnl[a].Name = string.Concat("pnl", a.ToString());
pnl[a].Size = new Size(100, 100);
//pnl[a].AutoScroll = true;

Bin für jede Hilfe dankbar.

Gruß
_Bugrick_
Attachments
private Nachricht | Beiträge des Benutzers
MrSparkle
myCSharp.de - Team

Avatar #avatar-2159.gif


Dabei seit:
Beiträge: 5983
Herkunft: Leipzig

beantworten | zitieren | melden

Hi _Bugrick_,

dein Bild zeigt eine blaue Fläche mit einer Scrollbar. Auch aus deiner Beschreibung werde ich nicht schlau. Was willst du denn eigentlich erreichen? Wie soll es denn aussehen und was funktioniert dabei nicht? Wie kommst du darauf, daß es an SuspendLayout liegt oder gar ein Bug im Framework ist?

Christian
Weeks of programming can save you hours of planning
private Nachricht | Beiträge des Benutzers
_Bugrick_
myCSharp.de - Member



Dabei seit:
Beiträge: 51

Themenstarter:

beantworten | zitieren | melden

Vielleicht fehlt doch noch etwas Kontext.

Die blaue Fläche ist das ganze UserControl etwas verkleinert.
Beim Laden des Controls sieht man schon kurz (für den Bruchteil einer Sekunde) die Scrollbar, bevor sie sich final sauber rechts positioniert, zusammen mit dem Rest des UserControls.
Übrigens findet alles in der GUI-Thread statt. Nichts Threadübergreifendes.

Eben eine Gegenprobe gemacht: Nutzt man beispielsweise das "UltraPanel" der Infragistics-Softwarekomponenten klappt das ganze ebenfalls problemlos, ohne, dass man beim Aufbau des UserControls kurz die Scrollbar mitten ins Nichts eingeblendet bekommt.
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10080

beantworten | zitieren | melden

Dein Problem ist eher
Zitat
das dynamisch eine Oberfläche mit ziemlich vielen Controls aufbaut.
Das ist nie eine Gute Wahl, denn in WindowsForms hat jedes Control mindestens ein Handle und die werden schnell knapp, bzw werden alle per WindowsMessage nacheinander gemalt.
Besser ist es wenn man partout viele Controls benutzen will auf WPF umzusteigen oder das meiste selber zu zeichnen.
private Nachricht | Beiträge des Benutzers
wcseller
myCSharp.de - Member



Dabei seit:
Beiträge: 191

beantworten | zitieren | melden

Zitat von FZelle
Dein Problem ist eher
Zitat
das dynamisch eine Oberfläche mit ziemlich vielen Controls aufbaut.
Das ist nie eine Gute Wahl, denn in WindowsForms hat jedes Control mindestens ein Handle und die werden schnell knapp, bzw werden alle per WindowsMessage nacheinander gemalt.
Besser ist es wenn man partout viele Controls benutzen will auf WPF umzusteigen oder das meiste selber zu zeichnen.

Das Limit liegt bei ungefähr 10.000 Handles pro Prozess - wenn die ausgeschöpft werden, hat man ein Design-Problem, dass auch mit WPF nicht zu erschlagen ist.

Das Problem wird eher sein, dass das Eltern-Control bereits sichtbar ist während die 'Kind'-Controls hinzugefügt werden. Hier bietet es sich an das Eltern-Control zu verbergen, dann die KindControls hinzuzufügen und anschließend das Eltern-Control wieder anzuzeigen. Um 'flackern' zu vermeiden sollte ausserdem DoubleBuffered beim Eltern-Control auf true gestellt und die Kind-Controls bereits in der korrekten Größe hinzugefügt werden (so man mit Docking und ähnlichem arbeitet).

Ausserdem sollte man 'Transparent' als Background-Color generell aber besonders für Panels und ähnliche Container vermeiden.
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von wcseller am .
private Nachricht | Beiträge des Benutzers
FZelle
myCSharp.de - Experte



Dabei seit:
Beiträge: 10080

beantworten | zitieren | melden

Das Theoretische Limit ist da, aber da wie gesagt jedes Control per Paint-Msg gezeichnet wird ist es eher bei >200 Handles nicht mehr flackerfrei.
private Nachricht | Beiträge des Benutzers