Laden...

Automatisches Scrollen des Controls mit dem Fokus in den sichtbaren Bereich verhindern

Erstellt von BeZi vor 13 Jahren Letzter Beitrag vor 12 Jahren 5.004 Views
B
BeZi Themenstarter:in
153 Beiträge seit 2007
vor 13 Jahren
Automatisches Scrollen des Controls mit dem Fokus in den sichtbaren Bereich verhindern

Moin @all,

ich habe eine Frage die sich wahrscheinlich relativ schnell beantworten lässt.

Ich habe ein Control in das mehere (selbst gebastelte) Controls angezeigt werden. Zwischen diesen Controls ist eine xy Matrix. Es gibt x Controls (überhalb der xy Matrix) und y Controls (links von der Matrix). Wenn ich jetzt die Maus in mein xy Control bewege wird das jeweilige x und y Control farblich markiert. Das funktioniert einwanfrei.

Wenn die xy Matrix aber so groß wird für das hauptcontrol dann wird automatisch ein Scrollbalken (vertikal) eingefügt. Das funktioniert auch.

Aber wenn ich nun nach unten scrolle und über meine xy Matrix fahre, so springt der Scrollbalken wieder nach oben und zeigt mir die aktuellen x Controls an. (wahrscheinlich bekommt das x Control den focus). Diese Springen würde ich gerne vermeiden. Weiss jemand wie das geht. Fettes Merci

916 Beiträge seit 2008
vor 13 Jahren

Hallo BeZi,

ich glaub ohne ein Screenshot zu posten, wird nicht mal einer verstehen was du überhaupt meinst!

Again what learned...

B
BeZi Themenstarter:in
153 Beiträge seit 2007
vor 13 Jahren

Hoffe so ist es verständlicher. Sorry kann keinen Screenshot machen, sensible Daten...
Wenn ich jetzt bei X mit der Maus klicke und fahre dann umher in der Matrix dann sprint der scrollbalken immer nach ganz oben.

Siehe Anhang

B
BeZi Themenstarter:in
153 Beiträge seit 2007
vor 13 Jahren

Ein weiteres Verhalten das ich jetzt festgestellt habe ist folgendes:
Wenn ich in die XY-Matrix klicke (siehe stelle X im angehängten Bild und die XY-Matrix geht noch über das komplette Control hinaus in y Richtung, deswegen Scrollbar), dann zentriert die Scrollbar das komplette Control und das X wird nicht an der gewünschten Stelle gesetzt. Das gewünschte X wird also an einer anderen Stelle gesetzt. Kann man dieses Zentrieren abschalten ? Sorry das ich als Bild nur eine Excelvorlage verwenden kann.

916 Beiträge seit 2008
vor 13 Jahren

sorry, aber ich denke so kann dir keiner helfen. Dein Problem in excel darzustellen ist doch sehr abwegig. Welche Controls nutzt du? Wenn du es wegen sensiblen Daten nicht posten kannst, dann lösche einfach die Daten aus dem Screenshot!

Again what learned...

B
BeZi Themenstarter:in
153 Beiträge seit 2007
vor 13 Jahren

Sorry, aber nein das geht nicht, denn die eigenentwickelten Controls gehören mit zu dem Umfang erklären dadurch schon zuviel und haben auch keine relevanz was das verhalten erklärt. Das gleiche passiert auch mit einem Standardbutton

So wie es scheint setzt AutoScroll die Scrollbalken immer auf den focus des Controls das geklickt wird.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo BeZi,

So wie es scheint setzt AutoScroll die Scrollbalken immer auf den focus des Controls das geklickt wird.

ja, so ist das.

Für ein Control dieser Art empfehle ich dir dringend, es selbst zu zeichnen (siehe [Artikel] Zeichnen in Windows-Programmen) und nicht aus anderen Controls zusammenzusetzen. Erstmal verursacht das die von die beschriebenen Probleme und zum anderen bekommt man auf diese Weise sehr schnell Performance-Probleme.

Hallo rollerfreak2,

also ich persönlich kann mir anhand der Bilder eigentlich ganz gut vorstellen, worum es geht.

herbivore

B
BeZi Themenstarter:in
153 Beiträge seit 2007
vor 13 Jahren

Ich habe eine MainControl in das die ganzen anderen "Sub"-Controls (auch eigene) eingestzt werde. Funktioniert alles einwandfrei. Keine Performanceprobleme 🙂 Nur diese eine Problem mit dem springen der Scrollbar bekomme ich nicht abgestellt.

Und danke wegen dem "Verständnisproblem". Also meine Frau hat das sogar kapiert 😉

Gibt es eine Lösung für das Scrollproblem @Herbivore ?

5.299 Beiträge seit 2008
vor 13 Jahren

Zunächst mal: Ich würde das mit einem DataGridView versuchen, in dem ich _CellPaint-Event die RowHeaderCells und die ColumnHeaderCells selbst zeichne. Diese Zellen sind leicht zu identifizieren, wenn die nämlich gezeichnet werden sollen, steht e.ColumnIndex / e.RowIndex jeweils auf -1.

Bei deinem Ansatz wundere ich mich, dass die X-/-Y - Controls den Focus erhalten, obwohl sie nur eine BackgroundColor zugewiesen bekommen.

Ich kann das nicht überprüfen, evtl. ist dein EinfärbeCode schuld, aber vlt. ist es auch tatsächlich das Zuweisen der BackColor, die das Scrollen auslöst (was ich eiglich nicht erwarten täte).

Der frühe Apfel fängt den Wurm.

49.485 Beiträge seit 2005
vor 13 Jahren

Hallo BeZi,

meine Einschätzung ist, dass es mindestens ziemlich schwierig sein wird, das Scrollproblem zu umgehen. Wenn ich mich recht erinnere ist es sogar so, dass eine TextBox, die den Focus schon hat, und die man absichtlich aus dem sichbaren Bereich scrollt, wieder automatisch in den sichtbaren Bereich zurück gescrollt wird, sobald man ein Zeichen eingibt. Wenn man es überhaupt irgendwie schaffen kann, dann wohl ziemlich lowlevel, d.h. in der WndProc [EDIT] siehe z.B. Control in Panel - Autoscroll - Scrollen des Controls mit Fokus in den sichtbaren Bereich verhindern [/EDIT]

herbivore

B
BeZi Themenstarter:in
153 Beiträge seit 2007
vor 13 Jahren

Vielen Dank erstmal....
Also @"ErfinderdesRades".... Die Controls sind schon fertig. Und ein Datagridview würde ich für soetwas niemals misshandeln..... Sowas macht man schön selbst 😉 . Aber trozdem danke.

@herbivore: Ok, ich versuche die Sache so zu umschiffen das ich wenn meine Maus in das jeweilige SubControl eintritt sich die Sache direkt focusiert mit ScrollControlIntoView. So ist das Springen zumindest einwenig besser. Naja vielleicht fällt mir noch eine andere Lösung ein.

Fettes merci nach Berlin... und die natürlich anderen auch.....

2.891 Beiträge seit 2004
vor 12 Jahren

Falls jemand vor der gleichen Problem steht (wie ich gerade):
In dem Control, das die Scrollbars anzeigt, die ScrollableControl.ScrollToControl-Methode (System.Windows.Forms) überschreiben:


protected override Point ScrollToControl(Control activeControl)
{
	return base.ScrollToControl(this);
}

Hinweis von herbivore vor 10 Jahren

Eine Variante dieses Vorschlags findet sich in Control in Panel - Autoscroll - Scrollen des Controls mit Fokus in den sichtbaren Bereich verhindern.