web-dev-qa-db-fra.com

Surligner automatiquement le texte dans un contrôle de zone de texte

Comment mettre en évidence automatiquement le texte dans un contrôle de zone de texte lorsque le contrôle devient actif.

32
Kevin

Dans Windows Forms et WPF:

textbox.SelectionStart = 0;
textbox.SelectionLength = textbox.Text.Length;
48
Reed Copsey

En asp.net:

textBox.Attributes.Add("onfocus","this.select();");
9
beon

Si vous souhaitez le faire pour l’ensemble de votre application WPF, vous pouvez procéder comme suit: - Dans le fichier App.xaml.cs

    protected override void OnStartup(StartupEventArgs e)
    {
        //works for tab into textbox
        EventManager.RegisterClassHandler(typeof(TextBox),
            TextBox.GotFocusEvent,
            new RoutedEventHandler(TextBox_GotFocus));
        //works for click textbox
        EventManager.RegisterClassHandler(typeof(Window),
            Window.GotMouseCaptureEvent,
            new RoutedEventHandler(Window_MouseCapture));

        base.OnStartup(e);
    }
    private void TextBox_GotFocus(object sender, RoutedEventArgs e)
    {
        (sender as TextBox).SelectAll();
    }

    private void Window_MouseCapture(object sender, RoutedEventArgs e)
    {
        var textBox = e.OriginalSource as TextBox;
        if (textBox != null)
             textBox.SelectAll(); 
    }
9
MontrealKid

Si vous souhaitez que le texte de la zone de texte soit mis en surbrillance par un clic de souris, vous pouvez le simplifier en ajoutant:

this.textBox1.Click += new System.EventHandler(textBox1_Click);

dans:

partial class Form1
{
    private void InitializeComponent()
    {

    }
}

où textBox1 est le nom de la zone de texte pertinente située dans Form1

Et créez ensuite la définition de la méthode:

void textBox1_Click(object sender, System.EventArgs e)
{
    textBox1.SelectAll();
}

dans:

public partial class Form1 : Form
{

}
5
Jan

Il est très facile à réaliser avec la méthode intégrée SelectAll

Vous pouvez simplement écrire ceci:

txtTextBox.Focus();
txtTextBox.SelectAll();

Et tout dans textBox sera sélectionné :)

4
Roxy'Pro

Je pense que le moyen le plus simple est d’utiliser TextBox.SelectAll comme dans un événement Enter:

private void TextBox_Enter(object sender, EventArgs e)
{
    ((TextBox)sender).SelectAll();
}
3
ShooShoSha

Voici le code que j'ai utilisé. Vous devez ajouter la propriété jointe à chaque zone de texte que vous souhaitez sélectionner automatiquement. Voyant que je ne voulais pas que tous les champs de texte de mon application fassent cela, c'était la meilleure solution pour moi.

public class AutoSelectAll
{
    public static bool GetIsEnabled(DependencyObject obj) 
    { 
        return (bool)obj.GetValue(IsEnabledProperty); 
    } 
    public static void SetIsEnabled(DependencyObject obj, bool value) 
    { 
        obj.SetValue(IsEnabledProperty, value);
    }

    static void ue_Loaded(object sender, RoutedEventArgs e)
    {
        var ue = sender as FrameworkElement;
        if (ue == null)
            return;
        ue.GotFocus += ue_GotFocus;
        ue.GotMouseCapture += ue_GotMouseCapture;
    }

    private static void ue_Unloaded(object sender, RoutedEventArgs e)
    {
        var ue = sender as FrameworkElement;
        if (ue == null)
            return;
        //ue.Unloaded -= ue_Unloaded;
        ue.GotFocus -= ue_GotFocus;
        ue.GotMouseCapture -= ue_GotMouseCapture;
    }

    static void ue_GotFocus(object sender, RoutedEventArgs e)
    {
        if (sender is TextBox)
        {
            (sender as TextBox).SelectAll();
        }
        e.Handled = true;
    }

    static void ue_GotMouseCapture(object sender, MouseEventArgs e)
    {
        if (sender is TextBox)
        {
            (sender as TextBox).SelectAll();
        }
        e.Handled = true;
    }

    public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.RegisterAttached("IsEnabled", typeof(bool),
        typeof(AutoSelectAll), new UIPropertyMetadata(false, IsEnabledChanged));

    static void IsEnabledChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var ue = d as FrameworkElement;
        if (ue == null)
            return;
        if ((bool)e.NewValue)
        {
            ue.Unloaded += ue_Unloaded;
            ue.Loaded += ue_Loaded;
        }
    }
} 

Le principal changement que j'ai apporté ici a été d'ajouter un événement chargé à de nombreux exemples que j'ai vus. Cela permet au code de continuer à fonctionner après son déchargement (c.-à-d. Qu'un onglet est modifié). De plus, j'ai inclus du code pour m'assurer que le texte est sélectionné si vous cliquez sur la zone de texte avec la souris, et pas seulement le focus clavier. Remarque: si vous cliquez réellement sur le texte dans la zone de texte, le curseur est inséré comme il se doit entre les lettres.

Vous pouvez l'utiliser en incluant la balise suivante dans votre xaml.

<TextBox  
    Text="{Binding Property}"
    Library:AutoSelectAll.IsEnabled="True" />
2
Zamotic

Si vous devez le faire pour un grand nombre de zones de texte (dans Silverlight ou WPF), vous pouvez utiliser la technique utilisée dans le message de blog: http://dnchannel.blogspot.com/2010/01/silverlight-3 -auto-select-text-in.html . Il utilise les propriétés attachées et les événements routés.

1
user260578

Pour les événements "Entrée" (par exemple: appuyez sur la touche Tab) ou "Premier clic", tout le texte sera sélectionné. dotNET 4.0

public static class TbHelper
{
    // Method for use
    public static void SelectAllTextOnEnter(TextBox Tb)
    {
        Tb.Enter += new EventHandler(Tb_Enter);
        Tb.Click += new EventHandler(Tb_Click);
    }

    private static TextBox LastTb;

    private static void Tb_Enter(object sender, EventArgs e)
    {
        var Tb = (TextBox)sender;
        Tb.SelectAll();
        LastTb = Tb;
    }

    private static void Tb_Click(object sender, EventArgs e)
    {
        var Tb = (TextBox)sender;
        if (LastTb == Tb)
        {
            Tb.SelectAll();
            LastTb = null;
        }
    }
}
0
Alatey

Sous forme de fenêtre c #. Si vous utilisez Enter event, cela ne fonctionnera pas. essayez d'utiliser l'événement MouseUp

    bool FlagEntered;
    private void textBox1_MouseUp(object sender, MouseEventArgs e)
    {
        if ((sender as TextBox).SelectedText == "" && !FlagEntered)
        {
            (sender as TextBox).SelectAll();
            FlagEntered = true;
        }
    }

    private void textBox1_Leave(object sender, EventArgs e)
    {
        FlagEntered = false;
    }
0
congchien

Je ne sais pas pourquoi personne n'en a parlé mais tu peux aussi faire ça, ça marche pour moi

textbox.Select(0, textbox.Text.Length)
0
believe me

Tu peux utiliser ça, chiche. :RÉ

TextBox1.Focus();    
TextBox1.Select(0, TextBox1.Text.Length);
0
Majid

Si vous voulez sélectionner tout le texte uniquement lorsque l'utilisateur clique pour la première fois dans la zone, puis les laisser cliquer au milieu du texte s'ils le souhaitent, c'est le code que j'ai finalement utilisé.

La gestion de l'événement FocusEnter ne fonctionne pas, car l'événement Click survient après et remplace la sélection si vous SelectAll() dans l'événement Focus.

private bool isFirstTimeEntering;
private void textBox_Enter(object sender, EventArgs e)
{
    isFirstTimeEntering = true;
}

private void textBox_Click(object sender, EventArgs e)
{
    switch (isFirstTimeEntering)
    {
        case true:
            isFirstTimeEntering = false;
            break;
        case false:
            return;
    }

    textBox.SelectAll();
    textBox.SelectionStart = 0;
    textBox.SelectionLength = textBox.Text.Length;
}
0
Brendan Gooden
 textBoxX1.Focus();
 this.ActiveControl = textBoxX1;
 textBoxX1.SelectAll();
0