C #을 사용하여 텍스트에 탭 문자 삽입 만들고 있습니다 . 출력은에 일반 텍스트가됩니다 TextBox. 이러한 정보를

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

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

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

예를 들어, 다음 대신에

Ann 26
Sarah 29
Paul 45

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

26 사라 29 폴 45

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



답변

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


답변

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

\' 작은 따옴표를 위해.

\" 큰 따옴표를 위해.

\\ 백 슬래시

\0 널 문자의 경우.

\a 경고 문자.

\b 백 스페이스 용.

\f 양식 피드.

\n 새로운 줄을 위해.

\r 캐리지 리턴.

\t 가로 탭의 경우

\v 세로 탭의 경우

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

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

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


답변

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

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

답변

var text = "Ann@26"

var editedText = text.Replace("@", "\t");

답변

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


답변

를 사용하면 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);
        }
    }
}

답변

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

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