2010-12-16 12 views
6

Mam aplikację WinForm z kilkoma elementami sterującymi wprowadzania w formularzu. W procedurze obsługi zdarzenia sprawdzania poprawności (Validating lub Validated), muszę określić, którą kontrolę aktywować w następnej kolejności, na podstawie zweryfikowanej wartości.Jak ustawić fokus na formant po sprawdzeniu poprawności w .NET

w dokumentacji Microsoftu imprezy Validating, stwierdza:

Uwaga

Nie próbować ustawić ostrość od wewnątrz Enter GotFocus, Odchodzenie, LostFocus, zatwierdzania lub Zatwierdzone obsługi zdarzeń. Może to spowodować, że aplikacja lub system operacyjny przestanie odpowiadać. Aby uzyskać więcej informacji, zobacz temat WM_KILLFOCUS w sekcji "Referencje klawiatury" i sekcję "Zakłócenia wiadomości" w sekcji "Informacje o wiadomościach i kolejkach wiadomości" w bibliotece MSDN pod adresem http: // msdn.microsoft.com/library .

Istnieje właściwość ActiveControl dla klasy Form, która umożliwia ustawienie kontroli, która ma stać się aktywna i nie są wymieniane żadne ograniczenia. Nie znalazłem żadnego innego rozwiązania po kilkugodzinnym wyszukiwaniu w Internecie.

Czy ustawienie wartości ActiveControl (zamiast Focus) z mojej funkcji Walidowane zdarzenie jest bezpiecznym sposobem na aktywację żądanej kontrolki? Jeśli nie, czy są jakieś rozwiązania?

Ponieważ usługa .NET Compact Framework nie ma właściwości ActiveControl, czy ktoś może zaproponować rozwiązanie?

Odpowiedz

9

Tak, zmiany ostrości podczas Walidujący razie jest dość kłopotliwe. Wydarzenie jest podnoszone dokładnie w momencie zmiany ostrości. Następna kontrola uzyskała już punkt skupienia w odniesieniu do systemu Windows, ale stan formularza logicznego nadal koncentruje się na walidacji kontroli. Po ustawieniu e.Cancel na true, WinForm musi cofnąć stan fokusa systemu Windows. Kiedy tego nie zrobisz, musi zaktualizować stan logiczny po zdarzeniu. Istnieje wiele różnych rzeczy, które mogą się nie udać, gdy sam zmienisz ostrość.

Ważne jest, aby poczekać, aż posortowana zostanie ostrość. Najlepiej jest opóźnić swój kod, dopóki wszystko nie zostanie uruchomione, a formularz ponownie przejdzie w stan bezczynności. Możesz to zrobić za pomocą metody Control.BeginInvoke(). Coś takiego:

private delegate void ChangeFocusDelegate(Control ctl); 

    private void textBox1_Validating(object sender, CancelEventArgs e) { 
     int value; 
     if (!int.TryParse(textBox1.Text, out value)) e.Cancel = true; 
     else { 
      if (value == 1) this.BeginInvoke(new ChangeFocusDelegate(changeFocus), textBox2); 
      else this.BeginInvoke(new ChangeFocusDelegate(changeFocus), textBox3); 
     } 
    } 
    private void changeFocus(Control ctl) { 
     ctl.Focus(); 
    } 
+0

Wow, sprytna odpowiedź! Sądziłem, że delegowana metoda musi wywołać EndInvoke(), ale to było zanim poznałem różnicę między Delegate.BeginInvoke() i Control.BeginInvoke(). Zobacz \t [.net - Jaka jest różnica między Invoke() i BeginInvoke] [1] [1] http://stackoverflow.com/questions/229554/whats-the-difference-between-invoke-and-begininvoke – Suncat2000

1

Czy próbowałeś ustawić Cancel property z CancelEventArgs, które są przekazywane do obsługi zdarzeń Validating na False?

Jest to zamierzony sposób na skupienie się na bieżącym sterowaniu i zapobieganie ustawianiu następnej kontroli, jeśli walidacja nie powiedzie się. Na przykład:

private void TextBox1_Validating(object sender, System.ComponentModel.CancelEventArgs e) 
{ 
    //Make sure that the textbox is not left blank 
    if (string.IsNullOrEmpty(TextBox1.Text)) 
    { 
     e.Cancel = true; 
    } 
} 
+0

Dzięki. Wiem o tym, ale skupia się tylko na zmianie. Nie pozwala ustawić ostrości na konkretną kontrolę. – Suncat2000

+0

@Suncat: Tak, nie mogłem powiedzieć od pytania, że ​​chcesz ustawić fokus na * inny * kontrolkę. Hans dał ci już dobrą odpowiedź, jak to zrobić. –

0

Ten wątek jest stary, ale mam kilka myśli:

  1. Każda kontrola ma właściwość Tag.Co powiesz na nadanie żądanej kontroli konkretnej wartości Tag, a następnie utworzysz metodę, która będzie wykonywała iteracje za pomocą elementów sterujących, aby znaleźć tę kontrolę? Następnie możesz ustawić na nim ostrość.

  2. Zamiast używać zdarzenia sprawdzania poprawności, czemu zamiast tego użyć opcji Opuszczanie? Wydaje się, że nie ma tych samych dziwactw.

Powiązane problemy