2009-06-16 9 views
8

Po otwarciu formularza system automatycznie ustawia jeden z elementów sterujących za Ciebie. O ile mogę powiedzieć, kontrola, która dostaje fokus, jest pierwszą aktywowaną kontrolką w kolejności tabulacji, zgodnie ze standardowym zachowaniem Windows.Jak określić, która kontrola powinna być skupiona podczas otwierania formularza?

Pytanie, jak to zmienić w czasie wykonywania, bez konieczności dynamicznego zmieniania kolejności tabulatorów. Na przykład, niektóre formularze mogą chcieć zróżnicować kontrolę skoncentrowaną początkowo w oparciu o logikę programu, aby skupić się na najbardziej odpowiedniej kontroli. Jeśli skupisz się tylko na innej kontrolce wewnątrz twojej obsługi OnLoad, domyślna logika i tak zostanie wykonana i ponownie skupia kontrolę domyślną.

Jeśli piszesz w C/C++ i stosując surowe procedury okna lub MFC można powrócić 0 (FALSE) z obsługi WM_INITDIALOG, a domyślne koncentrując logiki zostanie pominięty. Jednak nie mogę znaleźć sposobu, aby to zrobić w Windows Forms. Najlepszym Mam wymyślić jest użycie BeginInvoke aby ustawić ostrość po OnLoad wykończeniach, tak:

protected override void OnLoad(System.EventArgs e) 
{ 
    base.OnLoad(e); 
    // ... code ... 
    BeginInvoke(new MethodInvoker(() => this.someControl.Focus())); 
} 

Musi być jakiś właściwy sposób to zrobić - co to jest?

Odpowiedz

13

Po przekopaniu się przez reflektor, znalazłem coś, co wydaje się być "poprawnym" sposobem na to: używając ContainerControl.ActiveControl. Można to zrobić z OnLoad (lub gdzie indziej, zobacz dokument dotyczący ograniczeń) i bezpośrednio podaje ramy, które chcesz kontrolować.

Przykład użycia:

protected override void OnLoad(System.EventArgs e) 
{ 
    base.OnLoad(e); 
    // ... code ... 
    this.ActiveControl = this.someControl; 
} 

Wydaje się najczystszych i najprostsze rozwiązanie do tej pory.

+0

Dzięki. To działa! –

+0

nie tylko wybór pokazuje na contole, ale nie jest w stanie pisać na wybranym polu tekstowym lub kolejność tabulacji również nie przejść do następnego. –

1
public void ControlSetFocus(Control^ control) 
    { 

     // Set focus to the control, if it can receive focus. 
     if (control->CanFocus) 
     { 
     control->Focus(); 
     } 
    }  
+0

Dzięki - to na ogół służy do ustawiania kontroli, ale nie pomaga w przypadku, który opisuję. – Charlie

+0

Dlaczego? ................ –

+0

Zgadzam się z Adamem. Potrzebujesz zdarzenia, które wystąpi później w cyklu uruchamiania formularza. –

0

Zamiast zdarzenia onload nie można użyć Form.Activated lub Form.Shown wydarzeń, aby zobaczyć czy są one nazywane renderowania post sterowania naciskiem?

+0

Dzięki za pomysły. Jednak czekam na jakieś inne rozwiązanie, ponieważ te zdarzenia mogą wystąpić wiele razy w całym okresie istnienia formularza. Idealnie chcę zmienić fokus dopiero po otwarciu formularza - po tym, cokolwiek robił użytkownik, powinno zostać zachowane. – Charlie

+0

Nie jestem pewien, czy te zdarzenia są wywoływane więcej razy niż zdarzenie Onload, zaraz po otwarciu formularza. Zajrzyj tutaj http://msdn2.microsoft.com/en-us/library/86faxx0d.aspx ... i powinieneś być w stanie zarządzać tym, ile razy twoja logika fokusa zostanie wystrzelona w samym formularzu. –

+0

Niestety, ta grafika jest nieco zwodniczy. "Aktywowany" będzie się uruchamiać za każdym razem, gdy powrócisz do formularza po przejściu do innej aplikacji/formularza. "Pokazane" będzie uruchamiane za każdym razem, gdy wyświetlisz formularz, co może się zdarzyć więcej niż raz, jeśli używasz niemodnego formularza i pokazujesz/ukrywasz go (w przeciwieństwie do używania ShowDialog do modalnego wyświetlania formularza). – Charlie

Powiązane problemy