Wenn ein C # WinForms-Textfeld den Fokus erhält, soll es sich wie die Adressleiste Ihres Browsers verhalten.
Um zu sehen, was ich meine, klicken Sie in die Adressleiste Ihres Webbrowsers. Sie werden das folgende Verhalten bemerken:
- Durch Klicken in das Textfeld sollte der gesamte Text ausgewählt werden, wenn das Textfeld zuvor nicht fokussiert war.
- Wenn Sie mit der Maus nach unten und in das Textfeld ziehen, sollte nur der Text ausgewählt werden, den ich mit der Maus hervorgehoben habe.
- Wenn das Textfeld bereits fokussiert ist, wird durch Klicken nicht der gesamte Text ausgewählt.
- Wenn Sie das Textfeld programmgesteuert oder über die Tastatur tippen, sollte der gesamte Text ausgewählt werden.
Ich möchte genau dies in WinForms tun.
SCHNELLSTER GEWEHRWARNUNG: Bitte lesen Sie Folgendes, bevor Sie antworten! Danke Leute. :-)
Das Aufrufen von .SelectAll () während der Ereignisse .Enter oder .GotFocus funktioniert nicht, da beim Klicken auf das Textfeld das Caret dort platziert wird, wo er geklickt hat, wodurch die Auswahl des gesamten Texts aufgehoben wird .
Das Aufrufen von .SelectAll () während des .Click-Ereignisses funktioniert nicht, da der Benutzer keinen Text mit der Maus auswählen kann. Der Aufruf von .SelectAll () überschreibt weiterhin die Textauswahl des Benutzers.
Das Aufrufen von BeginInvoke ((Action) textbox.SelectAll) bei focus / enter event enter funktioniert nicht, da es gegen Regel 2 oben verstößt und die Auswahl des Benutzers bei focus weiterhin überschreibt.
quelle
Antworten:
Zunächst einmal vielen Dank für die Antworten! 9 Antworten insgesamt. Danke dir.
Schlechte Nachrichten: Alle Antworten hatten einige Macken oder funktionierten nicht ganz richtig (oder überhaupt nicht). Ich habe jedem Ihrer Beiträge einen Kommentar hinzugefügt.
Gute Nachricht: Ich habe einen Weg gefunden, damit es funktioniert. Diese Lösung ist ziemlich unkompliziert und scheint in allen Szenarien zu funktionieren (Mauszeiger, Textauswahl, Tabulatorfokus usw.).
Soweit ich das beurteilen kann, verhält sich ein Textfeld genau so wie die Adressleiste eines Webbrowsers.
Hoffentlich hilft dies dem nächsten Mann, der versucht, dieses täuschend einfache Problem zu lösen.
Nochmals vielen Dank, Jungs, für all Ihre Antworten, die mir geholfen haben, den richtigen Weg zu finden.
quelle
alreadyFocused = true;
in MouseUp aus der if-Anweisung verschieben. Wenn Sie sofort Teile des Textes auswählen, wird beim nächsten Klick der gesamte Text erneut ausgewählt.Ich habe eine einfachere Lösung dafür gefunden. Es beinhaltet das asynchrone Starten von SelectAll mit,
Control.BeginInvoke
damit es auftritt, nachdem die Enter- und Click-Ereignisse aufgetreten sind:In C #:
In VB.NET (danke an Krishanu Dey )
quelle
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.
funktioniert nicht wie gewünscht. Aber immer noch die kürzeste und eleganteste Lösung :)Ihre Lösung ist gut, schlägt jedoch in einem bestimmten Fall fehl. Wenn Sie den TextBox-Fokus festlegen, indem Sie einen Textbereich auswählen, anstatt nur zu klicken, wird das Flag "bereits fokussiert" nicht auf "true" gesetzt. Wenn Sie also ein zweites Mal in die TextBox klicken, wird der gesamte Text ausgewählt.
Hier ist meine Version der Lösung. Ich habe den Code auch in eine Klasse eingefügt, die TextBox erbt, sodass die Logik gut versteckt ist.
quelle
Es ist ein bisschen kludgey, aber in Ihrem Klick-Ereignis verwenden
SendKeys.Send( "{HOME}+{END}" );
.quelle
Ereignis der Textbox anklicken? Oder sogar das MouseCaptureChanged-Ereignis funktioniert für mich. - OK. funktioniert nicht
Sie müssen also zwei Dinge tun:
Funktioniert auch zum Tabulieren (über Textfelder zu dem einen) - rufen Sie SelectAll () in Enter auf, nur für den Fall ...
quelle
Eine einzeilige Antwort, die ich benutze ... Sie könnten sich selbst treten ...
Im Enter-Ereignis:
txtFilter.BeginInvoke (neuer MethodInvoker (txtFilter.SelectAll));
quelle
Ok, nachdem du es hier ausprobiert hast, ist was du willst:
Dadurch wurde der gesamte Text bei der Eingabe ausgewählt, aber ich konnte anschließend einen Teil des Textes hervorheben oder beim ersten Klick hervorheben.
Auf Anfrage:
Für mich wählt das Tabulieren in das Steuerelement den gesamten Text aus.
quelle
Hier ist eine Hilfsfunktion, die die Lösung auf die nächste Ebene bringt - Wiederverwendung ohne Vererbung.
Um dies zu verwenden, rufen Sie einfach die Funktion auf, die eine TextBox übergibt, und sie kümmert sich um alle unordentlichen Teile für Sie. Ich schlage vor, alle Ihre Textfelder im Form_Load-Ereignis zu verkabeln. Sie können diese Funktion in Ihrem Formular oder, wenn Sie mich mögen, irgendwo in einer Utility-Klasse platzieren, um sie noch besser wiederzuverwenden.
quelle
Dies funktionierte für eine WPF / XAML-TextBox.
quelle
Dies ähnelt der populären Antwort von nzhenry , aber ich finde es einfacher, keine Unterklasse zu haben:
quelle
SelectAll hat bei mir nie funktioniert.
Das funktioniert.
quelle
Ich habe eine noch einfachere Lösung gefunden:
Stellen Sie sicher, dass der Click-Handler den Enter-Handler aufruft, um sicherzustellen, dass beim Klicken auf ein Textfeld der gesamte Text ausgewählt ist. Keine zusätzlichen Variablen erforderlich!
Beispiel:
quelle
quelle
Interessanterweise hat eine ComboBox mit DropDownStyle = Simple ziemlich genau das Verhalten, das Sie suchen, denke ich.
(Wenn Sie die Höhe des Steuerelements verringern, um die Liste nicht anzuzeigen - und dann um einige Pixel mehr -, gibt es keinen effektiven Unterschied zwischen der ComboBox und der TextBox.)
quelle
Warum verwenden Sie nicht einfach das MouseDown-Ereignis des Textfelds? Es funktioniert gut für mich und benötigt keinen zusätzlichen Booleschen Wert. Sehr sauber und einfach, zB:
quelle
Ich habe SelectAll innerhalb des MouseUp-Ereignisses aufgerufen und es hat gut funktioniert.
quelle
Leiten Sie einfach eine Klasse von TextBox oder MaskedTextBox ab:
Und verwenden Sie es auf Ihren Formularen.
quelle
Haben Sie die im MSDN-Forum "Windows Forms General" vorgeschlagene Lösung ausprobiert , bei der TextBox einfach untergeordnet wird?
quelle
Tatsächlich ist GotFocus das richtige Ereignis (Nachricht wirklich), an dem Sie interessiert sind, da Sie dies sogar irgendwann erhalten, egal wie Sie zur Steuerung gelangen. Die Frage ist, wann Sie SelectAll () aufrufen.
Versuche dies:
quelle
Für eine Gruppe von Textfeldern in einem Formular:
quelle
Ich weiß, dass dies bereits gelöst wurde, aber ich habe einen Vorschlag, den ich eigentlich für ziemlich einfach halte.
Im Mouse-Up-Ereignis müssen Sie nur platzieren
Es scheint für mich in VB.NET zu funktionieren (ich weiß, dass dies eine C # -Frage ist ... leider bin ich gezwungen, VB bei meiner Arbeit zu verwenden ... und ich hatte dieses Problem, was mich hierher gebracht hat ... )
Ich habe noch keine Probleme damit gefunden .. außer der Tatsache, dass es nicht sofort beim Klicken ausgewählt wird, aber ich hatte Probleme damit ....
quelle
Die folgende Lösung funktioniert für mich. Ich habe hinzugefügt
OnKeyDown
und dasOnKeyUp
Ereignis überschrieben, damit der TextBox-Text immer ausgewählt bleibt.quelle
Stellen Sie die Auswahl ein, wenn Sie die Steuerung verlassen. Es wird da sein, wenn Sie zurückkommen. Tabulator um das Formular und wenn Sie zum Steuerelement zurückkehren, wird der gesamte Text ausgewählt.
Wenn Sie mit der Maus hineingehen, wird das Caret zu Recht an der Stelle platziert, an der Sie geklickt haben.
quelle
Sehr einfache Lösung:
BEARBEITEN: Das ursprüngliche OP war insbesondere besorgt über die Sequenz Maus-Ab / Textauswahl / Maus-Auf. In diesem Fall würde die obige einfache Lösung dazu führen, dass Text teilweise ausgewählt wird.
Dies sollte * das Problem lösen (in der Praxis fange ich WM_SETCURSOR ab):
* Eigentlich endet die folgende Sequenz mit einer teilweisen Textauswahl, aber wenn Sie die Maus über das Textfeld bewegen, wird der gesamte Text erneut ausgewählt:
Mouse-Down / Textauswahl / Mouse-Move-Out-Textbox / Mouse-Up
quelle
Ich finde diese Arbeit am besten, wenn Sie mit der Maus klicken und nicht sofort loslassen:
quelle
Meine Lösung ist ziemlich primitiv, funktioniert aber gut für meinen Zweck
quelle
Das Folgende scheint zu funktionieren. Das Enter-Ereignis behandelt das Tabulieren des Steuerelements und MouseDown funktioniert, wenn auf das Steuerelement geklickt wird.
quelle
Die Antwort kann tatsächlich ganz einfach sein als ALLE oben genannten, zum Beispiel (in WPF):
Natürlich kann ich nicht wissen, wie Sie diesen Code verwenden möchten, aber der Hauptteil, den Sie hier betrachten sollten, ist: Rufen Sie zuerst .Focus () und dann .SelectAll () auf;
quelle
Verwenden Sie einfach selectall (), um Ereignisse einzugeben und darauf zu klicken
quelle
Ich habe ein neues VB.Net Wpf-Projekt erstellt. Ich habe eine TextBox erstellt und Folgendes für das Codebehind verwendet:
quelle