여러 값을 캡처 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
다음 양식이 표시됩니다
이제 모든 값이 올바르게 정렬되었음을 알 수 있습니다 🙂
비고
Multiline
TextBox의 속성은 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;
이것은 잘 작동하지만 모노 간격 글꼴이 있어야합니다.