web-dev-qa-db-fra.com

Rembourrage de la zone de texte

J'ai cherché sur Internet, je dois utiliser les mauvais mots-clés car je ne trouve rien. Je veux créer une zone de texte qui a un texte commençant un peu loin de la gauche.

http://dab.biz/images/screenie/2011-02-04_1316.png

Juste comme ça.

22
dab

Comme vous l'avez probablement découvert, les zones de texte Winforms n'ont pas de propriété de remplissage. Puisque les panneaux exposent une propriété Padding, une technique consiste à:

  1. Créer un panneau
  2. Définissez sa bordure pour correspondre à une zone de texte (par exemple, Fixed3D)
  3. Définissez sa couleur d'arrière-plan pour correspondre à une zone de texte (par exemple, blanc ou fenêtre)
  4. Définissez son rembourrage à votre satisfaction (par exemple, 10,3,10,3)
  5. Ajouter une zone de texte à l'intérieur du panneau
  6. Définissez la bordure de la zone de texte sur none
  7. Jouez avec les propriétés Dock et Anchor de la zone de texte pour obtenir l'effet souhaité

Cela devrait vous aider à démarrer. Vous pouvez également créer un contrôle personnalisé faisant la même chose que celle mentionnée ci-dessus. 

Dans le cas où vous parliez de Textbox dans asp.net, utilisez simplement CSS:
input[type="text"] {padding: 3px 10px} 

37
Nimrod

Eh bien, vous pouvez TrimLeft, puis concaténer avec 5 espaces. Vous pouvez également configurer un contrôle UserControl personnalisé avec un TextBox sans bordure comme élément d’entrée réel, superposant un autre TextBox ne comportant pas de tabstop et déplaçant le focus sur celui qui n’a pas de bordure.

7
KeithS

OK, voici une solution appropriée. Tout d’abord, définissez Multiline de votre contrôle TextBox sur true.

Nécessaire en utilisant des déclarations:

using System.Drawing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

Code:

private const int EM_SETRECT = 0xB3;

[DllImport(@"User32.dll", EntryPoint = @"SendMessage", CharSet = CharSet.Auto)]
private static extern int SendMessageRefRect(IntPtr hWnd, uint msg, int wParam, ref RECT rect);

[StructLayout(LayoutKind.Sequential)]
private struct RECT
{
    public readonly int Left;
    public readonly int Top;
    public readonly int Right;
    public readonly int Bottom;

    private RECT(int left, int top, int right, int bottom)
    {
        Left = left;
        Top = top;
        Right = right;
        Bottom = bottom;
    }

    public RECT(Rectangle r) : this(r.Left, r.Top, r.Right, r.Bottom)
    {
    }
}

public void SetPadding(TextBox textBox, Padding padding)
{
    var rect = new Rectangle(padding.Left, padding.Top, textBox.ClientSize.Width - padding.Left - padding.Right, textBox.ClientSize.Height - padding.Top - padding.Bottom);
    RECT rc = new RECT(rect );
    SendMessageRefRect(Handle, EM_SETRECT, 0, ref rc);
}

Maintenant, appelez comme ceci:

SetPadding(myTextBox, new Padding(5, 5, 5, 5));

Bien sûr, le mieux est de créer votre propre contrôle TextBox qui peut automatiquement définir Multiline sur true et arrêter les sauts de ligne indésirables dans le texte, etc.

5
user990827

Cette question a recommandé la réponse déjà. Quoi qu'il en soit, je voudrais mettre une réponse alternative. Pour ajouter un remplissage à la zone de texte en c #, vous pouvez utiliser la méthode "padLeft". J'espère que cette aide à quelqu'un.

textBox1.Text = "Hello";
textBox1.Text = textBox1.Text.PadLeft(textBox1.Text.Length + 5);

or

textBox1.Text = textBox1.Text.PadLeft(textBox1.Text.Length + 5, '*');
3
Leo

Je sais que c'est un peu vieux. Mais voici une solution. Pour le texte initial, ajoutez un espace au début. Ensuite, vous pouvez remplacer l'événement OnKeyPress et ajouter le code suivant afin que vous ne puissiez pas revenir en arrière.

protected override void OnKeyPress (KeyPressEventArgs e) {
   base.OnKeyPress (e);
   if (e.KeyChar == (char)Keys.Back && Text.Length == 1) e.Handled = true;
   else e.Handled = true;
}

Vous pouvez remplacer le 1 avec le nombre d'espaces à remplir.

1
kakkarot

Développer une réponse ci-dessus et un inconvénient perçu de pouvoir revenir en arrière à travers la valeur complétée. La propriété SelectionStart de la zone de texte peut être utilisée pour déterminer l'emplacement du curseur lorsque l'événement TextChanged est déclenché. 

Dans cet exemple, la zone de texte est complétée au début par deux espaces afin que les informations affichées soient alignées sur d'autres contrôles non saisis dans lesquels la propriété de remplissage est utilisée.

    private void textBox1_TextChanged(object sender, EventArgs e)
    {
        int pad = 2;
        int cursorPos = textBox1.SelectionStart;
        textBox1.Text = textBox1.Text.Trim().PadLeft(textBox1.Text.Trim().Length + pad);
        textBox1.SelectionStart = (cursorPos > pad ? cursorPos : pad);
    }
0
Galactic