wake-up-neo.com

Textfeldauffüllung

Ich habe im Internet gesucht, ich muss die falschen Suchbegriffe verwenden, da ich nichts finden kann. Ich möchte eine Textbox erstellen, deren Text etwas von links beginnt.

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

Genau so.

22
dab

Wie Sie höchstwahrscheinlich festgestellt haben, verfügen Winforms-Textfelder über keine Auffüllungseigenschaften. Da Panels eine Padding-Eigenschaft freilegen, wäre eine Technik:

  1. Erstellen Sie ein Panel
  2. Festlegen, dass der Rahmen einem Textfeld entspricht (z. B. Fixed3D)
  3. Festlegen der Hintergrundfarbe für ein Textfeld (z. B. Weiß oder Fenster)
  4. Stellen Sie die Polsterung zu Ihrer Zufriedenheit ein (z. B. 10,3,10,3).
  5. Fügen Sie ein Textfeld im Panel hinzu
  6. Setzen Sie den Rahmen der Textbox auf none
  7. Spielen Sie mit den Dock- und Ankereigenschaften des Textfelds, um den gewünschten Effekt zu erzielen

Damit sollten Sie anfangen. Sie können auch ein benutzerdefiniertes Steuerelement erstellen, das dasselbe wie oben beschrieben ausführt. 

Falls Sie in asp.net von Textboxen gesprochen haben, verwenden Sie einfach CSS:
input[type="text"] {padding: 3px 10px} 

37
Nimrod

Nun, Sie können TrimLeft verwenden und dann mit 5 Leerzeichen verketten. Sie können auch ein benutzerdefiniertes UserControl mit einem randlosen TextBox-Element als eigentliches Eintragselement einrichten, das ein anderes TextBox-Fenster überblendet, das keinen Tabstop hat und den Fokus auf das randlose Textfeld verlagert, wenn es fokussiert ist.

7
KeithS

OK, hier ist eine richtige Lösung. Setzen Sie zunächst Multiline Ihres TextBox-Steuerelements auf true.

Benötigt mit Anweisungen:

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);
}

Rufe jetzt so an:

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

Natürlich ist es am besten, ein eigenes TextBox-Steuerelement zu erstellen, das Multiline automatisch auf true setzen und unerwünschte Zeilenumbrüche im Text usw. stoppen kann.

5
user990827

Diese Frage hat bereits eine Antwort empfohlen. Ich möchte auf jeden Fall eine alternative Antwort setzen. Um dem Textfeld in c # eine Auffüllung hinzuzufügen, können Sie die Methode "padLeft" verwenden. Hoffe das jemandem helfen.

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

or

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

Ich weiß, das ist ein bisschen alt. Aber hier ist eine Lösung. Fügen Sie für den Anfangstext ein Leerzeichen am Anfang ein. Dann können Sie das OnKeyPress-Ereignis überschreiben und den folgenden Code hinzufügen, damit Sie nicht zurückspulen können.

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;
}

Sie können die 1 durch die Anzahl der Leerzeichen ersetzen.

1
kakkarot

Erweiterung einer obigen Antwort und eines wahrgenommenen Nachteils, durch den aufgefüllten Wert zurückgehen zu können. Mit der SelectionStart-Eigenschaft des Textfelds kann festgelegt werden, wo der Cursor positioniert werden soll, wenn das TextChanged-Ereignis ausgelöst wird. 

In diesem Beispiel wird das Textfeld am Anfang mit zwei Leerzeichen aufgefüllt, so dass die angezeigten Informationen mit anderen Steuerelementen ohne Eingabe übereinstimmen, bei denen die Auffüll-Eigenschaft verwendet wird.

    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