Laden...

tabpage scrollen ...

Erstellt von schnecke vor 18 Jahren Letzter Beitrag vor 18 Jahren 5.615 Views
S
schnecke Themenstarter:in
223 Beiträge seit 2005
vor 18 Jahren
tabpage scrollen ...

Ich habe eine (bzw. mehrere) Tabpage(s), auf der ein UserControl liegt und auf dem per Paint gezeichnet wird. Das Control aussenrum hat die Größe des Bildschirmes (die Anwendung füllt den ganzen Bildschirm aus). Die Tabpage selber ist aber teilweise 5000x5000px groß. Habe horizontale und vertikale Scrollbars.
Nun habe ich eine Suchfunktion, die nach gezeichneten Strings auf dem TabPage sucht und wenn der String gefunden wurde, wird dieser kurz von einem Rechteck umrandert, um das suchergebnis optisch hervorzuhaben. Das geht auch soweit.... allerdings mit der Einschränkung, dass der gesuchte string im Anzeigebereich liegt. Liegt dieser z.B. an der pos. (4200/2800) dann klappt das nicht. Wie kann ich das aber erreichen, also das da automatisch hingescrollt wird?! Also dass die Scrollbalken sich dann so verschieben, dass man den Teilbereich sehen kann?! Habe schon Tabpage.location etc. ausprobiert, aber das klappt nicht wirklich....

... jemand ne Idee?! 🙁

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo schnecke,

ich denke mit ScrollableControl.AutoScrollPosition müsste es gehen.

herbivore

S
schnecke Themenstarter:in
223 Beiträge seit 2005
vor 18 Jahren

Das klappt leider nicht... 🙁
... gestern hatte ich noch eine Methode/Eigenschaft gefunden, um diesen Schieber der Scrollbar auf eine Position zu setzen... aber ich kann es patou nicht mehr finden, habe schon alle Klassen durchsucht, aber ich finde es nicht... aber gestern war es noch da... 🤔

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo schnecke,

bei Scrollbar direkt gibt es Maximum, Minimum und Value. Du müsstest als nur noch Zugriff bekommen. 🙂

Aber ich denke immer noch, dass es mit ScrollableControl.AutoScrollPosition gehen müsste.

herbivore

S
schnecke Themenstarter:in
223 Beiträge seit 2005
vor 18 Jahren

Gut, AutoScrollPosition geht eigentlich, ABER...

-> warum geht das hier nicht?!


// Klassenattribute...
private Point scrollPosition = new Point(0,0);
// ...

// In einer Methode:
TabPage tabp = this.tabControl.TabPages[aktuellesTab];		
tabp.AutoScrollPosition = this.scrollPosition;      // hier 

... also die Variable scrollPosition hat in einer anderen Methode den Wert (1000,100) bekommen. Wenn ich mir an der Stelle "hier" im Code scrollPosition ausgeben lasse, wird mir auch richtig (1000,100) angezeigt. Lasse ich mir dann aber an der gleichen Stelle den Wert von tabp.AutoScrollPosition ausgeben, bekomme ich den Wert (0,0). Dabei weise ich tabp.AutoScrollPosition doch den Wert von scrollPosition zu...!!! Warum geht das nicht bzw. warum scheint er das nicht "anzunehmen"?!

Bitte euch nochmal um Hilfe!
Danke!

49.485 Beiträge seit 2005
vor 18 Jahren

Hallo schnecke,

ich habe das jetzt mal ausprobiert und bei mir geht es mit AutoScrollPosition problemlos.

Allerdings hat AutoScrollPosition bei mir nach dem Setzen nicht die Werte, die ich gesetzt habe, sondern die negativen Werte davon, und diese negativen Werte werden noch durch die maximale "Verschiebung" begrenzt.

Wenn du also (im Effekt) sowas machst:

tabp.AutoScrollPosition = this.scrollPosition;
this.scrollPosition = tabp.AutoScrollPosition;
tabp.AutoScrollPosition = this.scrollPosition;

wirst du Probleme bekommen, aber wenn du die AutoScrollPosition jedesmal absolut setzt, müsste es gehn. Tuts jedenfalls bei mir.

herbivore

S
schnecke Themenstarter:in
223 Beiträge seit 2005
vor 18 Jahren

Also ich habe irgendwie schon wieder Probs mit dem Scrollen, dieses Mal in einem Panel... ich glaube, ich bin da zu blöde für X(...hier mein Code:


Point foundPos = new Point(0,0);
//...

if(valueFound)
{
   foundPos.X = 1000;
   foundPos.Y = 500;
}

panel.AutoScrollPosition = foundPos;
				
MessageBox.Show(foundPos.ToString() );
MessageBox.Show(panel.AutoScrollPosition.ToString() );

Ich bekomme als Ausgabe:

(x=1000,y=500)

und

(x=0,y=0)

... hähhh?!?! 🤔

4.221 Beiträge seit 2005
vor 18 Jahren

Hast Du Panel.AutoScroll auf true ?.... und ist das Control auf dem Panel grösser als das Panel ?

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

S
schnecke Themenstarter:in
223 Beiträge seit 2005
vor 18 Jahren

Original von Programmierhans
Hast Du Panel.AutoScroll auf true

ja.

Original von Programmierhans
ist das Control auf dem Panel grösser als das Panel ?

ja... habe da ein Bild drauf, dass größer ist als das Panel. Das Panel hat auch Scrollbars. 🙁

4.221 Beiträge seit 2005
vor 18 Jahren

Bist Du sicher dass die Scrollbars dem Panel gehören (und nicht der Picturebox) ?

(prüfe den Size der Picturebox und des Panels zur Laufzeit)

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

S
schnecke Themenstarter:in
223 Beiträge seit 2005
vor 18 Jahren

Also der Debugger bestätigt, dass die Scrollbars dem Panel gehören.

4.221 Beiträge seit 2005
vor 18 Jahren

Original von schnecke
Also der Debugger bestätigt, dass die Scrollbars dem Panel gehören.

Und die Size-Werte der PictureBox und des Panels ?

Und ist die PictureBox AUF dem Panel

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...

S
schnecke Themenstarter:in
223 Beiträge seit 2005
vor 18 Jahren

Size-Wert der PictureBoxen sind 30x30 (es sind mehrere, die zu einem großen Bild gehören) und Size des Panels ist 1500x1000. Die PictureBoxen sind auf dem Panel. Dann zeichne ich noch auf dem Panel eine Bitmap, die 3000x1500 groß ist, deshalb hat das Panel auch Scrollbars.

S
schnecke Themenstarter:in
223 Beiträge seit 2005
vor 18 Jahren

Dieser Code hier:


Point p = this.panel.AutoScrollPosition;
p.X = 1000;
p.Y = 500;
this.panel.AutoScrollPosition = p;

MyCustomPanel panelNew = (MyCustomPanel)myPanels[1];
panelNew.Visible = true;
this.panel.Controls.Add(panelNew);

... ändert nicht die ScrollPosition meines Panels... aber warum?!

Der Debugger zeigt das hier (siehe Bild):
AutoScrollPosition ist (0,0) aber scrollPosition ist richtig (1000,500)... warum springt der Schiber der Scrollbalken da nicht hin?! Er bleibt einfach auf (0,0)... das kann doch nicht so schwer sein

S
schnecke Themenstarter:in
223 Beiträge seit 2005
vor 18 Jahren

Herje, jetzt habe ich des Rätsels Lösung... Petzold sei Dank... nach Durcharbeiten des ganzen Kapitels über Bildläufe ist mir klar, warum es nicht geht: Der Bildlaufbereich basiert auf Position und Größe der Steuerelemente im Clientbereich. Wenn keine Steuerelemente im Clientbereich vorhanden sind, wird der Bildlaufbereich auf (0,0) gesetzt. Also habe ich die Festlegung der Werte für meine Scrollbar nun erst dann gemacht, nachdem Komponenten auf meinen Panel gelandet sind - und nicht davor. So habe ich meinen Code nun auf folgende kleine Änderung angepasst:


// ERST dem Panel Komponenten hinzufügen
MyCustomPanel panelNew = (MyCustomPanel)myPanels[1];
panelNew.Visible = true;
this.panel.Controls.Add(panelNew); 

// Und DANN die AutoScrollPosition festlegen:
this.panel.AutoScrollPosition = new Point(1000,500);

Man... so einfach... wenn mans weiß... =) 8o 😁

4.221 Beiträge seit 2005
vor 18 Jahren

Original von schnecke
Wenn keine Steuerelemente im Clientbereich vorhanden sind, wird der Bildlaufbereich auf (0,0) gesetzt.

Dies passiert auch wenn die Controls vollständig im Clientbereich Platz haben.... daher wollte ich von Dir wissen ob denn die Controls wirklich grösser sind als das Panel (Problematik war mir bekannt)..... Dabei habe ich natürlich vorausgesetzt dass die Controls schon im Panel sind .....

Gruss
Programmierhans

Früher war ich unentschlossen, heute bin ich mir da nicht mehr so sicher...