versteckte Panels + AutoScroll Problem

kenny_lebt

Grünschnabel
Hallo alle miteinander,

ich habe eine Oberfläche geschrieben, in der ein Panel neue UserControls aufnimmt und diese nebenanander zeichnet. Irgendwann erscheint ein ScrollBar, den ich immer nach links schiebe, um das neu eingefügte UserControl zu sehen.

Mein Problem ist nun folgendes: Wenn das Panel sichtbar ist (.Show() ), dann funktioniert alles supi. Ist dieses aber versteckt mit .Hide(), so werden die neuen UserControls nur bis zu einem bestimmten Punkt (also solange keine ScrollBar benötigt wird) richtig gezeichnet. Danach werden die weiteren UserControlls entweder nicht oder übereinander gezeichnet.

Meine provisorische Lösung sah vor dieses Panel sichtbar zu machen und ein weiteres rüber zu legen, damit man es nicht sieht..So kann ich es aber definitiv nicht lassen, da ich mehrere Panels hintereinander habe und immer nur eines (auswählbar) sichtbar sein soll und die anderen im Hintergrund ebenso aktualisiert werden müssen.

BringToFront und SentToHide konnte leider keine Abhilfe schaffen..

Ich würde mich freuen, wenn einer eine Idee oder sogar Lösung für mich hätte ;)

Vielen Dank schon einmal!
 
In den beiden Anhängen kann man sich das Problem noch einmal ansehen..
 

Anhänge

  • 1.png
    1.png
    3,6 KB · Aufrufe: 34
  • 2.png
    2.png
    8,1 KB · Aufrufe: 38
so:

Code:
panel.Location = new Point(position + this.AutoScrollPosition.X, 0);
this.Controls.Add(panel);

this.AutoScrollPosition = new Point(position, this.AutoScrollPosition.Y);
this.position += 60;

Wobei 60 die Breite eines UserControls entspricht..
 
Ich würde nicht die Eigenschaft AutoScrollPosition verwenden, sondern die Position des letzten UserControls + seiner Breite

Ungefähr so:
Code:
panel.Location = new Point(this.Controls[this.Controls.Count-1].Right, 0)
 
Ok, ich habe meinen Code wie hier zu sehen geändert:

Code:
panel.Location = new Point(this.Controls[this.Controls.Count - 1].Right + 3, 0);
this.Controls.Add(panel);

this.AutoScrollPosition = new Point(this.Controls[this.Controls.Count - 1].Right + 3, 
                                                    this.AutoScrollPosition.Y);

Klappt in sofern prima, dass alle Bilder vorhanden sind..jedoch wird in den inaktiven Panels das erste UserControl nicht bei (0, 0) gezeichnet (die ScrollBar wird schon eingeblendet). Weiter sind größere Lücken zwischen den UserControls keine seltenheit.

Vielleicht hast du da auch einen Rat für mich..der erste war schon spitze!

Danke nochmal!!
 
Zuletzt bearbeitet:
Ich habe mal die Zeile rausgenommen:

Code:
this.AutoScrollPosition = new Point(this.Controls[this.Controls.Count - 1].Right + 3, 
                                                    this.AutoScrollPosition.Y);

..und jetzt funktioniert es. Jedoch springe ich nicht mehr automatisch zum letzten
UserControl. Gibt es da noch eine andere Möglichkeit?
 
Vorweg, bei meinem Code gehe ich davon aus das das ParentControl wirklich nur diese gewünschten UserControls anzeigen soll.

Ich habe mal die Zeile rausgenommen:

Code:
this.AutoScrollPosition = new Point(this.Controls[this.Controls.Count - 1].Right + 3, 
                                                    this.AutoScrollPosition.Y);

..und jetzt funktioniert es. Jedoch springe ich nicht mehr automatisch zum letzten
UserControl. Gibt es da noch eine andere Möglichkeit?

Wann springt er dort nicht hin, immer oder nur wenns ausgeblendet ist und du es einblenden willst?

Du könntest mal probieren einfach denn Focus zu setzen auf das letzte Control, bin mir jetzt nicht sicher aber könnte sein das er dann dort hinspringt.
 
Vorweg, bei meinem Code gehe ich davon aus das das ParentControl wirklich nur diese gewünschten UserControls anzeigen soll.

Ja.

Ich hab es bis jetzt so weit hinbekommen, dass zuletzt eingefügte UserControl angezeigt bekomme. Jedoch wenn das Panel ausgeblendet wird, dann können Lücken zwischen den UserControls entstehen und es sieht so aus, als ob die UserControls nicht ab Position (0, 0) im ParentControl gezeichnet werden, sondern erst ab z.B. (800, 0).

Wenn ich jedoch:

Code:
this.AutoScrollPosition = new Point(this.Controls[this.Controls.Count - 1].Right + 3, 
                                                    this.AutoScrollPosition.Y);

aus meinem Code auskommentiere, so werden die Panels richtig gezeichnet, das zuletzt eingefügte wird jedoch nicht angezeigt, sondern die ersten.

Vielleicht noch einmal zur Verdeutlichung: Ich verwende ein Panel in einer Form, welches die Größe (400, 120) hat und AutoScroll auf true gesetzt wurde. Nun füge ich diesem Panel weitere Panels hinzu, die nur bei bedarf sichtbar sein sollen und die UserControls beinhalten. Diese haben die gleichen Eigenschaften, wie das Panel in der Form.

P.s.: Focus() funktioniert leider nicht.

Ich danke dir für deine bisherige Hilfe..vielleicht fällt dir ja noch etwas ein mit der zusätzlichen Info, die ich dir gegeben habe.

Grüße kenny
 
probier mal:
Code:
panel.Location = new Point(this.Controls[this.Controls.Count-1].Right + this.AutoScrollPosition.X, 0)

beim Autoscroll verändert er ev. die Position des UserControls (Location), dies musst du laut der aktuellen Scrollposition dann gegen rechnen.

(glaube + da this.AutoScrollPosition.X einen negativen Wert halten müsste, ansonsten spiel kurz mit)
 
Zurück