2012-02-16 7 views
14

To jest dla formularza okna.C# Panel z autoskalowaniem - Resetowanie pozycji Srollbar w fokusie kontrolnym

panel ma AutoScroll = True

dodaję paneli dynamicznie do głównego panelu, który kończy się przekroczenia Wyświetlacz główny panel prostokąt. Następnie dodawanie etykiet, pól złożonych i pól tekstowych do dodanych paneli.

Jeśli wybiorę pole kombi lub pole tekstowe, resetuje pozycję paska przewijania na 0, a menu rozwijane dla pola kombi zostanie umieszczone na ekranie X, Y tam, gdzie powinno być, jeśli pasek przewijania był nie zresetować.

Zastanawiam się, czy zapisać pozycję przewijania, gdy wybrana jest kontrola. Po przetestowaniu wygląda na to, że pozycja przewijania nie została jeszcze zresetowana, więc mogę ją tutaj przechwycić. Następnie mam nadzieję, że przywrócisz pozycję przewijania na jakimś wydarzeniu panelu. Próbuję dowiedzieć się, jakie dokładnie zdarzenie użyję do przywrócenia pozycji przewijania. Mam również nadzieję, że rozwijane menu zostanie umieszczone we właściwym X, Y, kiedy to zrobię.

Lepszym rozwiązaniem byłoby utworzenie niestandardowego sterowania opartego na sterowaniu panelem i ewentualnego zastąpienia zdarzenia? W ten sposób nie musiałbym zagracać mojego projektu, zapisując pozycję przewijania za każdym razem, gdy używam przewijanego panelu.

+0

Wygląda na to, że jeśli wybiorę element sterujący, gdy przeskoczy on do góry, to po ponownym przewinięciu tego samego elementu kontrolnego pozycja paska przewijania nie zostanie zresetowana. – Untouchable

Odpowiedz

29

znalazłem odpowiedź na problem miałem tutaj: Answer

public class CustomPanel : System.Windows.Forms.Panel 
{ 
    protected override System.Drawing.Point ScrollToControl(System.Windows.Forms.Control activeControl) 
    { 
     // Returning the current location prevents the panel from 
     // scrolling to the active control when the panel loses and regains focus 
     return this.DisplayRectangle.Location; 
    } 
} 
+4

Dla przyszłych generacji (i jeśli łącze zostanie zerwane): 1. Panel podklasy 2. Zastąpić ScrollToControl(), aby go zwrócić.DisplayRectangle.Location – Asaf

+0

Dla osób o słabym sercu: _Subclassing_ nie obejmuje więcej niż: Wklej powyższy kod do swojego _Form.cs_ i zmień dwa miejsca w _Form.Designer.cs_ z '..System.Panel' na' CustomPanel'. – TaW

+0

Podczas korzystania z TabPage zamiast z panelu, procedura jest dokładnie taka sama, ale musisz odjąć 3 piksele od wartości X i Y lokalizacji DisplayRectangle.Location dla granicy TabControl. –

0

Dzięki, to działa świetnie z wyjątkiem musiałem dostosować do wypełnienia w panelu w dolnej. Tylko FYI dla każdego, kto może mieć jakieś korekty.

protected override System.Drawing.Point ScrollToControl(System.Windows.Forms.Control activeControl) 
{ 
    Point retPt = DisplayRectangle.Location; 
    retPt.Offset(new Point(-1*Padding.Left, -1*Padding.Bottom)); 

    return retPt; 
}