C #을 사용하여 텍스트에 탭 문자 삽입


283

여러 값을 캡처 Name하고 Age, 등으로 텍스트를 작성 해야하는 응용 프로그램을 만들고 있습니다 .

출력은에 일반 텍스트가됩니다 TextBox.

이러한 정보를 일종의 정보로 표시 columns하려고하므로 정보를 tab더 명확하게하기 위해 분리하려고합니다 .

예를 들어, 다음 대신에

Ann 26
Sarah 29
Paul 45

다음과 같이 표시하고 싶습니다.

26 사라 29 폴 45

insert텍스트를 탭 하는 방법에 대한 팁이 있습니까?


경고 메시지 ..... 이름 필드의 길이가 너무 길면 정렬 할 수 없습니다. "Ann"은 3 자입니다. "예레미야"는 8입니다. "Ann"에 추가 된 단일 탭은 ##이 예레미야가 끝나기 전에 나타날 수 있습니다. 문자 수로 구문 분석하는 것이 좋습니다. 공백으로 "분할"하고 12 자까지 첫 번째 구성원에 공백을 추가 한 다음 "26"을 추가하십시오. 이름이 12보다 길면 조정하십시오.
KeachyPeenReturns

방금 솔루션을 게시 한 후 KeachyPeenReturns의 의견을 읽었습니다. 그의 말은 정확하지만 그의 해결책은 불완전합니다. BEST 답변이 이미 잘못되었습니다. 내 솔루션을 읽고이 질문에 대한 상태 (BEST 답변)를 업데이트하십시오. 일반적 으로이 유형의 주석을 게시하지 않지만 질문은 매우 오래되었습니다.
schlebe

답변:


460

\t당신의 문자열 에서 문자를 사용해보십시오


445

Hazar는 그의 옳습니다 \t. C #의 이스케이프 문자 전체 목록은 다음과 같습니다.

\' 작은 따옴표를 위해.

\" 큰 따옴표를 위해.

\\ 백 슬래시

\0 널 문자의 경우.

\a 경고 문자.

\b 백 스페이스 용.

\f 양식 피드.

\n 새로운 줄을 위해.

\r 캐리지 리턴.

\t 가로 탭의 경우

\v 세로 탭의 경우

\uxxxx유니 코드 문자 16 진수 값 (예 :) \u0020.

\x와 동일 \u하지만 선행 0이 필요하지 않습니다 (예 :) \x20.

\Uxxxxxxxx 유니 코드 문자 16 진수 값 (대리 물 생성에 더 긴 형식 필요)


8
이 데이터를 어디에서 찾았습니까? 내 참고로 알고 싶습니다.
QueueHammer

@QueueHammer rom Jon Skeet 자신, 그것은 ... devblogs.microsoft.com/csharpfaq/…
Leonard AB

74

또한 사용하는 것이 유용 할 수 있습니다 String.Format, 예를 들어,

String.Format("{0}\t{1}", FirstName,Count);

17
코드가 하나의 라이너보다 길고 설명이 길기 때문에 이것이 가장 좋은 대답입니다.
Phil


2

여러 가지 방법이 있습니다. 가장 간단한 방법은 \t텍스트를 사용 하는 것입니다. 그러나 nuget 패키지 \t와 같은 일부 상황에서는 작동하지 않을 수 있습니다 PdfReport.


4
\t작동하지 않는 경우 탭을 추가하는 방법에 대한 정보를 추가하면 유용합니다 . ;)
J. Scott Elblein

2

를 사용하면 Microsoft Winform controls아래에서 설명 할 약간의 해결 방법없이 문제를 올바르게 해결할 수 없습니다.

문제

단순히 사용에 문제 "\t"또는 vbTab하나 이상의 텍스트 상자가 표시되고 그 정렬이 모든 텍스트 상자에 대해 존중해야 할 경우, 유일한 것입니다 "\t"또는 vbTab솔루션이 항상 올바르게 정렬되지 않습니다 무언가를 표시합니다.

VB.Net의 예 :

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    TextBox1.Text = "Bernard" + vbTab + "32"
    TextBox2.Text = "Luc" + vbTab + "47"
    TextBox3.Text = "François-Victor" + vbTab + "12"
End Sub

표시됩니다

여기에 이미지 설명을 입력하십시오

보시다시피,에 age대한 값 François-Victor은 오른쪽으로 이동하고 age다른 두 개의 TextBox의 값과 정렬되지 않습니다 .

해결책

이 문제를 해결하려면 SendMessage()아래와 같이 특정 user32.dll API 함수를 사용하여 탭 위치를 설정해야합니다 .

Public Class Form1

    Public Declare Function SendMessage _
        Lib "user32" Alias "SendMessageA" _
        ( ByVal hWnd As IntPtr _
        , ByVal wMsg As Integer _
        , ByVal wParam As Integer _
        , ByVal lParam() As Integer _
        ) As Integer

    Private Const EM_SETTABSTOPS As Integer = &HCB

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Dim tabs() As Integer = {4 * 25}

        TextBox1.Text = "Bernard" + vbTab + "32"
        SendMessage(TextBox1.Handle, EM_SETTABSTOPS, 1, tabs)
        TextBox2.Text = "Luc" + vbTab + "47"
        SendMessage(TextBox2.Handle, EM_SETTABSTOPS, 1, tabs)
        TextBox3.Text = "François-Victor" + vbTab + "12"
        SendMessage(TextBox3.Handle, EM_SETTABSTOPS, 1, tabs)
    End Sub

End Class

다음 양식이 표시됩니다

여기에 이미지 설명을 입력하십시오

이제 모든 값이 올바르게 정렬되었음을 알 수 있습니다 :-)

비고

MultilineTextBox의 속성은 True로 설정해야합니다 . 이 속성이 False로 설정되어 있으면 탭이 이전과 같이 배치됩니다.

AcceptsTab속성이 할당되는 방법 은 중요하지 않습니다 (테스트했습니다).

이 질문은 이미 StackOverflow에서 처리되었습니다.

주의 : 탭 위치 측정 단위는 문자가 아니라 문자의 1/4 인 것으로 보입니다. 그렇기 때문에 길이에 4를 곱한 것입니다.

C # 솔루션

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

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        [DllImport("User32.dll", CharSet = CharSet.Auto)]
        private static extern IntPtr SendMessage(IntPtr h, int msg, int wParam, uint[] lParam);
        private const int EM_SETTABSTOPS = 0x00CB;
        private const char vbTab = '\t';

        public Form1()
        {
            InitializeComponent();

            var tabs = new uint[] { 25 * 4 };

            textBox1.Text = "Bernard" + vbTab + "32";
            SendMessage(textBox1.Handle, EM_SETTABSTOPS, 1, tabs);
            textBox2.Text = "Luc" + vbTab + "47";
            SendMessage(textBox2.Handle, EM_SETTABSTOPS, 1, tabs);
            textBox3.Text = "François-Victor" + vbTab + "12";
            SendMessage(textBox3.Handle, EM_SETTABSTOPS, 1, tabs);
        }
    }
}

1
string St = String.Format("{0,-20} {1,5:N1}\r", names[ctr], hours[ctr]);
richTextBox1.Text += St;

이것은 잘 작동하지만 모노 간격 글꼴이 있어야합니다.


1

리터럴 문자열 (@ "로 시작)을 사용할 때 더 쉬울 수 있습니다.

char tab = '\u0009';
string A = "Apple";
string B = "Bob";
string myStr = String.Format(@"{0}:{1}{2}", A, tab, B);

결과 Apple:<tab>Bob


1

위의 답변 외에도 PadLeft 또는 PadRight를 사용할 수 있습니다.

string name = "John";
string surname = "Smith";

Console.WriteLine("Name:".PadRight(15)+"Surname:".PadRight(15));
Console.WriteLine( name.PadRight(15) + surname.PadRight(15));

이것은 문자열을 왼쪽이나 오른쪽에 공백으로 채 웁니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.