2011-02-04 14 views
18

He buscado a través de Internet, debo usar palabras clave incorrectas porque no puedo encontrar nada. Quiero crear un cuadro de texto que tenga el texto comenzando desde un poco lejos de la izquierda.Relleno de cuadro de texto

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

Al igual que.

+10

winforms, webforms, wpf ..? –

+1

Simplemente llano Jane Visual Studio. Mi error. – dab

+8

Eso no responde la pregunta. ¿Es este un proyecto de Windows Forms, un proyecto WPF (el nuevo reemplazo de Windows Forms) o un sitio web ASP.Net? Todos estos tienen cuadros de texto que se pueden agregar a través de Visual Studio, pero todos funcionan de manera diferente. –

Respuesta

33

Como probablemente haya descubierto, los cuadros de texto de Winforms no tienen una propiedad de relleno. Puesto que los paneles hacen exponer una propiedad Relleno, una técnica sería:

  1. crear un panel
  2. Establecer su frontera para que coincida con un cuadro de texto (por ejemplo, Fixed3D)
  3. establecer su color de fondo para que coincida con un cuadro de texto (por ejemplo, blanco o ventana)
  4. establezca su relleno para su satisfacción (por ejemplo, 10,3,10,3)
  5. Agregar un cuadro de texto dentro del panel
  6. Establecer la frontera de la caja de texto a ninguno
  7. Juega con las propiedades Dock y Anchor del Textbox obtienes el efecto deseado

Esto debería comenzar. También puede crear un control personalizado que haga lo mismo que se mencionó anteriormente.

En caso de que se habla de cuadros de texto en asp.net, sólo tiene que utilizar CSS:
input[type="text"] {padding: 3px 10px}

+2

El único problema es que para muchas más nuevas máscaras de Windows, Fixed3D en un TextBox se ve diferente que para un Panel. – KeithS

+1

Puede ser una buena idea configurar su panel para que tenga un evento de clic que se enfoque en el cuadro de texto. Dado que esta nueva área de relleno parecerá ser una parte del cuadro de texto, puede despedir al usuario si hace clic en él y nunca se enfoca en el cuadro de texto. –

+0

@ AdamPlocher En caso de asp.net :) – Adrian

6

Bueno, puede TrimLeft, luego concatenar con 5 espacios. O bien, puede configurar un UserControl personalizado con un TextBox sin bordes como el elemento de entrada real, superponiendo otro TextBox que no tiene una tabstop y cambiará el foco al sin bordes cuando esté enfocado.

3

Esta pregunta ha recomendado respuesta ya. De todos modos, me gustaría poner una respuesta alternativa. Para agregar relleno al cuadro de texto en C#, puede usar el método "padLeft". Espero que esta ayuda a alguien.

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

or 

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

Esto, desafortunadamente, tiene algunos inconvenientes. Por ejemplo, uno puede retroceder a través del relleno izquierdo. :( – Christian

+2

Encontré esta solución increíblemente útil ya que estoy usando un cuadro de texto de solo lectura, por lo que no puede ocurrir un retroceso. –

+1

@Christian En este caso, podría usar 'TextChanged()' para establecer 'PadLeft' en cada cambio. Por debajo de eso. – C4u

4

OK, aquí hay una solución adecuada. Primero configure Multiline de su control TextBox al true.

sea necesario con declaraciones:

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

Código:

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

ahora llaman así:

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

Por supuesto, lo mejor es crear su propio control de cuadro de texto, que puede automáticamente establezca Multiline en true y detenga las interrupciones de líneas no deseadas en el texto, etc.

0

Sé que esto es un poco viejo. Pero aquí hay una solución. Para el texto inicial, agregue un espacio al comienzo. A continuación, puede anular el evento OnKeyPress y agregar el siguiente código para que no pueda retroceder.

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

Puede reemplazar el 1 con el número de espacios en el pad.

Cuestiones relacionadas