2011-02-04 5 views
18

인터넷을 통해 검색 한 결과 아무 것도 찾을 수 없기 때문에 잘못된 키워드를 사용해야합니다. 왼쪽에서 조금 떨어진 곳에 텍스트가있는 텍스트 상자를 만들고 싶습니다. 그냥 그렇게텍스트 상자 패딩

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

.

+10

winforms, webforms, wpf ..? –

+1

그냥 일반 Jane Visual Studio. 내 잘못이야. – dab

+8

그 질문에 대답하지 않습니다. Windows Forms 프로젝트, WPF 프로젝트 (Windows Forms의 새로운 대체품) 또는 ASP.Net 웹 사이트입니까? 이들 모두에는 Visual Studio를 통해 추가 할 수있는 텍스트 상자가 있지만 모두 다르게 작동합니다. –

답변

33

WinForms 텍스트 상자에는 패딩 속성이 없을 가능성이 가장 높습니다.

  1. 은 (텍스트 상자에 맞게 배경색을 설정합니다 (예를 들어, Fixed3D를) 텍스트 상자에 맞게 국경을 설정 패널을 만듭니다 패널은 패딩 속성을 노출 할 수 있기 때문에, 하나 개의 기술은하는 것 예를 들어, 흰색 또는 창)
  2. 이 없음으로 텍스트 상자의 경계를 설정 패널
  3. 내부에 텍스트 상자를 추가) 10,3,10,3, 예를 들면 만족 (그것의 패딩을 설정
  4. 텍스트 상자의 독 (Dock) 및 앵커 속성을 사용하여 원하는 효과를 얻으십시오.

시작해야합니다. 위에서 언급 한 것과 동일한 작업을 수행하는 사용자 지정 컨트롤을 만들 수도 있습니다. 이미
input[type="text"] {padding: 3px 10px}

+2

많은 새로운 Windows 스킨의 경우 TextBox의 Fixed3D가 Panel과 다르게 보입니다. – KeithS

+1

텍스트 상자를 중점으로하는 클릭 이벤트를 패널에 설정하는 것이 좋습니다. 이 새로운 패딩 영역은 텍스트 상자의 일부로 표시되기 때문에 사용자가 클릭하면 텍스트 상자에 포커스를 얻지 못할 수도 있습니다. –

+0

@AdamPlocher asp.net의 경우 :) – Adrian

6

자, TrimLeft, 5 공백으로 연결할 수 있습니다. 또는 경계선없는 TextBox를 실제 입력 요소로 사용하여 사용자 지정 UserControl을 설정하고 탭이없는 다른 TextBox를 겹치게하고 초점이 맞춰지면 테두리없는 테두리로 포커스를 이동합니다.

3

이 질문에 추천 답변 :

경우 당신은 asp.net에서 텍스트 상자에 대해 얘기했다, 단지 CSS를 사용합니다. 어쨌든 나는 대체 답변을하고 싶습니다. C#에서 텍스트 상자에 패딩을 추가하려면 "padLeft"메서드를 사용할 수 있습니다. 누군가에게이 도움이되기를 바랍니다.

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

or 

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

이것은 불행히도 몇 가지 단점이 있습니다. 예를 들어 왼쪽 패딩을 통해 백 스페이스를 수행 할 수 있습니다. : – Christian

+2

이 솔루션은 놀랍게도 내가 백 스페이스가 발생하지 않을 수 있도록 읽기 전용 텍스트 상자를 사용함에 따라 유용하다고 느꼈다. –

+1

@Christian이 경우에는 모든 변경에 대해'TextLangft()'를 사용하여'PadLeft'를 사용할 수 있습니다. 그 아래에. – C4u

4

정상적인 해결책은 다음과 같습니다. 무엇보다 먼저 TextBox 컨트롤의 Multilinetrue으로 설정하십시오.

필요한 using 문 :

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

코드 :

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

지금과 같이 전화 :

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

, 가장 자동으로 할 수있는 자신의 TextBox 컨트롤을 만드는 것입니다 Multiline을 true로 설정하고 텍스트 등에서 원하지 않는 줄 바꿈을 중지하십시오.

0

나는 이것이 약간 오래된 것을 알고있다. 그러나 여기에 해결책이 있습니다. 초기 텍스트의 경우 처음에 공백을 추가하십시오. 그런 다음 OnKeyPress 이벤트를 무시하고 백 스페이스를 사용할 수 없도록 다음 코드를 추가 할 수 있습니다.

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

패드의 공백 수를 1로 대체 할 수 있습니다.