2009-04-16 3 views
4

Ich habe einen Teil des C# -Codes, der VerticalScroll.Value in einer Klasse festlegen soll, die von UserControl erbt. Es wird aufgerufen, wenn ein untergeordnetes Objekt der Klasse die Größe ändert. Die AutoScroll-Eigenschaft der Klasse ist auf "True" festgelegt.C# UserControl.VerticalScroll.Value wird nicht festgelegt

public void ScrollTo(int top) 
    { 
     if (top >= this.VerticalScroll.Minimum && top <= this.VerticalScroll.Maximum) 
     { 
      this.VerticalScroll.Value = top; 
     } 
    } 

Das Problem ist, wenn es durch den Code Tracing, manchmal this.VerticalScroll.Value gesetzt wird, manchmal hält sie den Wert, den es vor dem Aufruf dieser Methode wurde hatte.

Ist dies ein Fehler in VS, oder gibt es bekannte Bedingungen, unter denen der Wert Versuche ignoriert, es zu setzen? eine Lösung auf der MSDN-Website (lassen mich Beitrag Links nicht ‚, weil ich bin ein neuer Benutzer)

Danke, Rob

Antwort

19

Ich war das gleiche Problem und kam auf die Lösung in einigen dev Forum. Nachdem Sie VerticalScroll.Value festgelegt haben, müssen Sie PerformLayout() aufrufen, um das Scrolling-Steuerelement zu aktualisieren. So dies tun:

scrollingcontrol.VerticalScroll.Value = top; 
scrollingcontrol.PerformLayout(); 

Das macht mehr Sinn als .Wert Einstellung zweimal, obwohl es die gleiche Wirkung zu haben scheint.

+1

Aw c'mon, keine Liebe für meine Antwort, obwohl es "besser" ist als die angenommene Antwort? – stone

+1

Ich müsste es testen, um es abzustimmen. Da das Projekt im Mai abgeschlossen wurde, musst du warten, bis ich einen freien Moment habe. –

+2

skypecakes Antwort ist korrekt. Ich hatte heute genau das gleiche Problem und den Aufruf von PerformLayout() löste es. Vielen Dank. –

3

Ich wurde in das gleiche Problem laufen, und ich fand.

Die vorgeschlagene Lösung war .Wert zweimal zuweisen, und es funktionierte für mich:

int newVerticalScrollValue = 
     pDashboard.VerticalScroll.Value - pDashboard.VerticalScroll.SmallChange; 

pDashboard.VerticalScroll.Value = newVerticalScrollValue; 
pDashboard.VerticalScroll.Value = newVerticalScrollValue; 
+0

@Aowyn, danke eine Tonne, ich hatte gerade eine Chance, das zu testen, und es funktioniert super. –

0

FlowLayoutPanel scheint ein anderes Biest zu sein. Die Bildlaufleiste bewegt sich zwar nach unten, aber der Wert von flowlayoutpanel.VerticalScroll.Value bleibt bei 0. Ich habe alle oben genannten Techniken sowie einige DoEvents() und Thread.Sleep() versucht, sogar einen Timer, der sich vor der nächsten Iteration vollständig ergab. Es ist alles gescheitert. Ich entdecken schließlich, dass DisplayRectangle.Y sofort die Scroll-Änderung zum Ausdruck bringt ...

private void PrintButton_Click(object sender, EventArgs e) 
{ 
    FlowLayoutPanel flp = TheBuildFlowLayoutPanel; 
    List<Bitmap> printPics = new List<Bitmap>(); 
    int printLastY = 100; 
    flp.VerticalScroll.Value = 0; 
    while (flp.DisplayRectangle.Y < printLastY) // DisplayRect.Y becomes successively more negative 
    { 
     Bitmap bmp = new Bitmap(flp.Width, flp.Bounds.Height); 
     printPics.Add(bmp); 
     flp.DrawToBitmap(bmp, flp.ClientRectangle); 
     printLastY = flp.DisplayRectangle.Y; 
     flp.VerticalScroll.Value = Math.Min(flp.VerticalScroll.Maximum, flp.VerticalScroll.Value + flp.Height); 
    } 

    flp.VerticalScroll.Value = 0; 
    for (int i = 0; i < printPics.Count; i++) 
    { 
     printPics[i].Save("C:\\Temp" + i.ToString() + ".bmp"); 
    } 
} 
+0

Was wäre wirklich schön ist ein FlowLayoutPanel.Print oder FlowLayoutPanel.DrawFullContentsToBitmap – user922020

+0

Also, der oben genannte Code ist im Hinblick auf VerticalScrollbar.Value im speziellen Fall des FlowLayoutPanel On-Thema, so werde ich es verlassen. Die viel einfachere Lösung zum Drucken (eine Bitmap, keine Schleife) ist das Abdocken des FLP, legen Sie seine Größe auf (flp.Width, flp.VerticalScrollbar.Maxiumum) und drucken Sie es dann auf eine Bitmap. Dann ändere die Größe wieder auf normal zurück. Ich kann keine geeignete Eigenschaft finden, die mir die Größe der Arbeitsfläche angibt, auf der der FLP die Kontrolle legt. Es scheint seitwärts Autoscroll zu verwenden und VerticalScrollbar.Maximum zu verwenden ... – user922020

0

In meinem Fall war es notwendig, die VerticalScroll.Value auf einen anderen Wert zu setzen und dann auf den Wert von Interesse, z.B.

this.panel1.VerticalScroll.Value = verticalScrollPosition - 1; 
this.panel1.VerticalScroll.Value = verticalScrollPosition; 

Achten Sie darauf, dass die Scroll-Position immer zwischen VerticalScroll.Minimum und VerticalScroll.Maximum ist.