6
votes

Changez la position du curseur dans la zone de texte dans C # Windows

J'ai une winform qui charge Winform Winformes de MDI. Toutes les textes de texte de l'enfant Winform ont toujours du curseur restent à gauche et je ne peux pas le déplacer à une autre position, sauf que je choisis tout texte et réinversion.

Comment puis-je activer cela de faire du curseur peut rester à n'importe quelle position en utilisant la souris?


4 commentaires

Pour chaque zone de texte, essayez SelectionStart = i et SelectionLength = 0, où i est la position du curseur souhaitée.


Comment puis-je définir pour toutes les zones de texte? Cause 'j'ai beaucoup de boîtes de texte :(


Utilisez une boucle :) Les formulaires ont une propriété appelée contrôles, qui est un contrôle. Vous pouvez itérer sur ses éléments en utilisant foreach (var c dans form.controls) , testez si la commande actuelle est une zone de texte à l'aide de tb = c comme zone de texte; Si (tb! = null) ... et définissez la position du curseur pour tb .


Cela signifie qu'il n'y a aucun moyen de définir cela. Ex-une propriété de formulaire gagnant? Nous devons le faire manuellement :(


3 Réponses :


11
votes

Dans l'exemple suivant, le curseur sera positionné après le deuxième caractère dans chaque zone de texte de la forme. L'accent sera mis sur le dernier, mais en appuyant sur la touche TAB à plusieurs reprises, vous pouvez vérifier que la position du curseur a été définie pour chaque zone de texte.

using System;
using System.Windows.Forms;

public class Program
{
  public static void Main()
  {
    var form = new Form();
    form.Text = "Cursor Positioning Test";
    form.Visible = true;
    form.Shown += delegate(object sender, EventArgs args) {
      foreach (var control in form.Controls)
      {
        var textBox = control as TextBox;
        if (textBox != null)
        {
          textBox.Focus();
          textBox.SelectionStart = 2;
          textBox.SelectionLength = 0;
        }
      }
    };

    var textBox1 = new TextBox();
    textBox1.Text = "hello";
    textBox1.Left = 10;
    textBox1.Top = 10;
    form.Controls.Add(textBox1);

    var textBox2 = new TextBox();
    textBox2.Text = "stack";
    textBox2.Left = 10;
    textBox2.Top = 10 + textBox1.Height + 10;
    form.Controls.Add(textBox2);

    var textBox3 = new TextBox();
    textBox3.Text = "overflow";
    textBox3.Left = 10;
    textBox3.Top = 10 + textBox1.Height + 10 + textBox2.Height + 10;
    form.Controls.Add(textBox3);

    Application.Run(form);
  }
}


5 commentaires

KOL, génial, mais ne fonctionnera pas si vous effectuez les suivantes avec le foreach: foreach (contrôle de Textbox dans Form.Controls), vous n'en aurez pas besoin: VAR TEXTBOX = Contrôle en tant que zone de texte; Notez que je ne l'ai pas encore testé, mais je pense que cela devrait fonctionner.


@PavelDonchev Votre idée ne fonctionne que si tous les contrôles sont des boîtes de texte. Si vous avez également un bouton sur le formulaire, vous obtiendrez une exception disant System.Windows.Forms.button ne peut pas être converti en System.Windows.Forms.TextBox.


Je ne suis pas tout à fait sûr que tu as raison. Je viens de créer un formulaire avec un bouton et une zone de texte, puis écris ce qui suit: foreach (textbox tb dans ceci.controls) {MessageBox.show (Nom de TB.NAME); } Et n'avait aucun problème à l'exécuter et à obtenir le nom de la zone de texte sur le formulaire, il a simplement sauté le bouton. Très intéressé si cela ne fonctionne pas pour vous - pourquoi cela ne fonctionne pas. Je l'ai essayé sur des formulaires Windows, Visual Studio 2010, .NET Framework 4 Profil client (les paramètres par défaut pour moi). Désolé d'avoir à écrire du code dans les commentaires, je sais que cela n'apparaîtra pas bien.


@Paveldonchev J'ai testé votre idée avec le code ci-dessus, avec deux modifications: (1) Ajout d'une touche ( var = nouveau bouton (); form.controls.add (bouton); ), et ( 2) modifié le formulaire FORMER Délégué du gestionnaire d'événements à foreach (Textbox Textbox dans form.controls) {TEXTBOX.FOCUS (); textbox.selectionStart = 2; textbox.selectionLength = 0; } . Ce dernier jette l'exception que j'ai mentionnée ci-dessus.


Vous avez raison. Maintenant j'ai remarqué pourquoi ça m'a trompé. Dans le gestionnaire d'événements montré, le processus est tué (Visual Studio apparaît si vous débogage, vous affiche la ligne avec l'exception de distribution non valide). Si vous essayez de mettre le code dans le gestionnaire d'événements de charge, vous remarquerez que le formulaire se chargera normalement (sauf cela ne fonctionnera pas comme prévu). Si vous mettez le code dans le code. Comportement assez étrange.



1
votes

// Windows FUS MASKEDTEXTBOX INPUT DROIT AU TESTEX TESTEX AVEC '##. ####' MASQUE Decimal (6,4);

VOI PRIVÉ MASKEDTEXTBOXMASKRTF_KEYPRESSE (Expéditeur d'objet, KeyPresseEventargs e) { xxx


0 commentaires

7
votes

Essayez ceci, l'espoir vous aide;)

//if you want put cusror at the end of text use this:
TextBox1.SelectionStart = TextBox1.Text.Length;
TextBox1.SelectionLength = 0;
//use this for custom location  int CustomIndex 
TextBox1.SelectionStart = CustomIndex;
TextBox1.SelectionLength = 0;


0 commentaires