Gdy pole tekstowe C # WinForms otrzymuje fokus, chcę, aby zachowywało się jak pasek adresu przeglądarki.
Aby zobaczyć, co mam na myśli, kliknij pasek adresu przeglądarki internetowej. Zauważysz następujące zachowanie:
- Kliknięcie w polu tekstowym powinno zaznaczyć cały tekst, jeśli pole tekstowe nie było wcześniej zaznaczone.
- Wskaźnik myszy w dół i przeciągnij w polu tekstowym powinien zaznaczyć tylko tekst, który zaznaczyłem myszą.
- Jeśli pole tekstowe jest już fokusem, kliknięcie nie powoduje zaznaczenia całego tekstu.
- Skupienie pola tekstowego programowo lub za pomocą klawisza tabulacji na klawiaturze powinno zaznaczyć cały tekst.
Chcę dokładnie to zrobić w WinForms.
OSTRZEŻENIE NAJSZYBSZY PISTOLET: przeczytaj poniższe informacje przed udzieleniem odpowiedzi! Dzięki chłopaki. :-)
Wywołanie .SelectAll () podczas zdarzeń .Enter lub .GotFocus nie zadziała, ponieważ jeśli użytkownik kliknie pole tekstowe, daszek zostanie umieszczony w miejscu, w którym kliknął, usuwając tym samym cały tekst.
Wywołanie .SelectAll () podczas zdarzenia .Click nie zadziała, ponieważ użytkownik nie będzie mógł zaznaczyć myszą żadnego tekstu; wywołanie .SelectAll () będzie nadal nadpisywać zaznaczenie tekstu użytkownika.
Wywołanie BeginInvoke (pole tekstowe (Action ).SelectAll) w zdarzeniu fokus / enter nie działa, ponieważ łamie regułę nr 2 powyżej, będzie nadpisywać zaznaczenie użytkownika na fokusie.
źródło
Odpowiedzi:
Przede wszystkim dziękuję za odpowiedzi! Łącznie 9 odpowiedzi. Dziękuję Ci.
Zła wiadomość: wszystkie odpowiedzi były dziwne lub nie działały poprawnie (lub wcale). Dodałem komentarz do każdego z Twoich postów.
Dobra wiadomość: znalazłem sposób, aby to zadziałało. To rozwiązanie jest dość proste i wydaje się działać we wszystkich scenariuszach (najechanie kursorem, zaznaczanie tekstu, zaznaczanie tabulatorem itp.)
O ile wiem, powoduje to, że pole tekstowe zachowuje się dokładnie tak, jak pasek adresu przeglądarki internetowej.
Miejmy nadzieję, że pomoże to następnemu facetowi, który spróbuje rozwiązać ten pozornie prosty problem.
Jeszcze raz dziękuję za wszystkie odpowiedzi, które pomogły mi skierować się na właściwą ścieżkę.
źródło
alreadyFocused = true;
mysz MouseUp z instrukcji if. Ponieważ jeśli od razu zaznaczysz fragmenty tekstu, kolejne kliknięcie spowoduje ponowne zaznaczenie całego tekstu.Znalazłem prostsze rozwiązanie tego problemu. Obejmuje uruchomienie SelectAll asynchronicznie przy użyciu,
Control.BeginInvoke
tak aby wystąpiło po wystąpieniu zdarzeń Enter i Click:W C #:
W VB.NET (dzięki Krishanu Dey )
źródło
Private Sub MyTextBox_Enter(sender As Object, e As EventArgs) Handles MyTextBox.Enter BeginInvoke(DirectCast(Sub() MyTextBox.SelectAll(), Action)) End Sub
Mouse down and drag in the textbox should select only the text I've highlighted with the mouse.
nie działa zgodnie z oczekiwaniami. Ale wciąż najkrótsze i najbardziej eleganckie rozwiązanie :)Twoje rozwiązanie jest dobre, ale zawodzi w jednym konkretnym przypadku. Jeśli ustawisz fokus na TextBox, zaznaczając zakres tekstu zamiast po prostu klikać, flaga jużFocussed nie zostanie ustawiona na wartość true, więc po drugim kliknięciu w TextBox cały tekst zostanie zaznaczony.
Oto moja wersja rozwiązania. Umieściłem również kod w klasie, która dziedziczy TextBox, więc logika jest ładnie ukryta.
źródło
To trochę niezdarne, ale w przypadku kliknięcia użyj
SendKeys.Send( "{HOME}+{END}" );
.źródło
Kliknij wydarzenie pola tekstowego? Lub nawet zdarzenie MouseCaptureChanged działa dla mnie. - DOBRZE. nie działa.
Musisz więc zrobić 2 rzeczy:
Działa również do tabulacji (przez textBoxes do jednego) - wywołaj SelectAll () w Enter na wszelki wypadek ...
źródło
Jedna linia odpowiedzi, której używam ... możesz się kopać ...
W wydarzeniu Enter:
txtFilter.BeginInvoke (new MethodInvoker (txtFilter.SelectAll));
źródło
Ok, po wypróbowaniu tutaj jest to, czego chcesz:
Spowoduje to zaznaczenie całego tekstu przy wejściu, ale pozwoliło mi podświetlić część tekstu później lub umożliwić wyróżnienie za pierwszym kliknięciem.
Na żądanie:
Dla mnie przejście do kontrolki powoduje zaznaczenie całego tekstu.
źródło
Oto funkcja pomocnicza przenosząca rozwiązanie na wyższy poziom - ponowne wykorzystanie bez dziedziczenia.
Aby z tego skorzystać, po prostu wywołaj funkcję przekazującą TextBox i zajmie się ona wszystkimi niechlujnymi bitami za Ciebie. Proponuję połączyć wszystkie pola tekstowe w zdarzeniu Form_Load. Możesz umieścić tę funkcję w swoim formularzu lub, jeśli jesteś podobny do mnie, gdzieś w klasie narzędzi do jeszcze większego wykorzystania.
źródło
To zadziałało dla WPF / XAML TextBox.
źródło
Jest to podobne do popularnej odpowiedzi nzhenry , ale łatwiej mi jest nie tworzyć podklas:
źródło
SelectAll nigdy nie działało dla mnie.
To działa.
źródło
Znalazłem jeszcze prostsze rozwiązanie:
Aby upewnić się, że cały tekst jest zaznaczony po kliknięciu pola tekstowego, upewnij się, że moduł obsługi kliknięcia wywołuje procedurę obsługi Enter. Nie ma potrzeby stosowania dodatkowych zmiennych!
Przykład:
źródło
źródło
Co ciekawe, ComboBox z DropDownStyle = Simple ma prawie dokładnie takie zachowanie, którego szukasz, jak sądzę.
(Jeśli zmniejszysz wysokość kontrolki, aby nie wyświetlać listy - a następnie o kilka pikseli więcej - nie ma efektywnej różnicy między ComboBox a TextBox.)
źródło
Dlaczego po prostu nie użyjesz MouseDown-Event w polu tekstowym? U mnie działa dobrze i nie wymaga dodatkowych wartości logicznych. Bardzo czysty i prosty, np .:
źródło
Zadzwoniłem do SelectAll wewnątrz wydarzenia MouseUp i działało dobrze.
źródło
Po prostu wyprowadź klasę z TextBox lub MaskedTextBox:
I używaj go w swoich formularzach.
źródło
Czy wypróbowałeś rozwiązanie zaproponowane na forum MSDN „Windows Forms General”, które po prostu zawiera podklasy TextBox?
źródło
W rzeczywistości GotFocus to właściwe wydarzenie (wiadomość naprawdę), które Cię interesuje, ponieważ bez względu na to, jak dojdziesz do kontroli, otrzymasz to nawet w końcu. Pytanie brzmi, kiedy wywołujesz SelectAll ().
Spróbuj tego:
źródło
Dla grupy pól tekstowych w formularzu:
źródło
Wiem, że to już zostało rozwiązane, ale mam sugestię, która moim zdaniem jest raczej prosta.
W przypadku myszki wszystko, co musisz zrobić, to umieścić
Wydaje się, że działa dla mnie w VB.NET (wiem, że to jest pytanie C # ... niestety jestem zmuszony używać VB w mojej pracy ... i miałem ten problem, który mnie tu sprowadził ... )
Nie znalazłem jeszcze żadnych problemów ... poza tym, że nie wybiera od razu po kliknięciu, ale miałem z tym problemy ....
źródło
Poniższe rozwiązanie działa dla mnie. Dodałem
OnKeyDown
iOnKeyUp
nadpisanie zdarzenia, aby tekst TextBox był zawsze zaznaczony.źródło
Ustaw selekcję po opuszczeniu sterowania. Będzie tam, kiedy wrócisz. Tabulator wokół formularza i po powrocie do kontrolki cały tekst zostanie zaznaczony.
Jeśli wejdziesz myszą, karetka zostanie umieszczona w miejscu, w którym kliknąłeś.
źródło
Bardzo proste rozwiązanie:
EDYCJA: Oryginalny OP był w szczególności zaniepokojony sekwencją przesuwania myszy / zaznaczania tekstu / przesuwania myszy, w którym to przypadku powyższe proste rozwiązanie kończyłoby się częściowym zaznaczeniem tekstu.
To powinno * rozwiązać problem (w praktyce przechwytuję WM_SETCURSOR):
* Właściwie następująca sekwencja kończy się częściowym zaznaczeniem tekstu, ale jeśli najedziesz myszą na pole tekstowe, cały tekst zostanie ponownie zaznaczony:
mouse-down / text-selection / mouse-move-out-textbox / mouse-up
źródło
Uważam, że to działa najlepiej, gdy klikam myszą i nie puszczam natychmiast:
źródło
Moje rozwiązanie jest dość prymitywne, ale działa dobrze w moim celu
źródło
Poniższe wydaje się działać. Zdarzenie enter obsługuje tabulacja do kontrolki, a MouseDown działa po kliknięciu kontrolki.
źródło
Odpowiedź może być w rzeczywistości znacznie prostsza niż WSZYSTKIE powyższe, na przykład (w WPF):
oczywiście nie wiem, jak chcesz użyć tego kodu, ale główna część do obejrzenia to: Najpierw wywołaj .Focus (), a następnie wywołaj .SelectAll ();
źródło
po prostu użyj selectall () w zdarzeniach enter i kliknij
źródło
Stworzyłem nowy projekt VB.Net Wpf. Utworzyłem jeden TextBox i użyłem następującego za kodem:
źródło