C#を使用してテキストにタブ文字を挿入する


283

いくつかの値をキャプチャしてName、それらを使用してテキストを作成する必要があるアプリケーションを作成しています:Age、など

出力は、へのプレーンテキストになりTextBoxます。

私はそれらの情報をのように表示することを試みているためcolumns、それらをtab明確にするためにそれらを分離することを試みています。

たとえば、代わりに:

Ann 26
Sarah 29
Paul 45

私はそれを次のように見せたいです:

アン・タブ 26サラ・タブ 29ポールのタブ 45

insertタブをテキストに挿入するためのヒントはありますか?


警告の言葉.....名前フィールドの長さが長すぎる場合でも、それらを揃えることはできません。「アン」はたった3文字です。「エレミア」は8です。「アン」に1つのタブを追加すると、##がエレミアの終わりの前に表示される場合があります。文字数で解析することをお勧めします。スペースで「分割」し、12文字まで最初のメンバーにスペースを追加してから、「26」を追加します。12よりも長い可能性のある名前がある場合は、調整してください
KeachyPeenReturns

解決策を投稿した後、KeachyPeenReturnsのコメントを読んだところです。彼の発言は正しいですが、彼の解決策は不完全です。最良の答えはすでに間違っています。私のソリューションを読んで、この質問のステータス(BEST回答)を更新してください。通常、私はこのタイプのコメントを投稿しませんが、質問は非常に古いです。
schlebe

回答:



445

ハザールは彼の言う通り\tです。C#のエスケープ文字の完全なリストは次のとおりです。

\' 一重引用符。

\" 二重引用符。

\\ バックスラッシュ。

\0 null文字の場合。

\a 警告文字。

\b バックスペース用。

\f フォームフィード用。

\n 新しいラインのために。

\r キャリッジリターン。

\t 水平タブ用。

\v 垂直タブ用。

\uxxxxUnicode文字の16進数値(例:)\u0020

\x\uはと同じですが、先行ゼロは必要ありません(例:)\x20

\Uxxxxxxxx Unicode文字の16進数値(サロゲートの生成には長い形式が必要)。


8
このデータはどこで見つけましたか?参考までに知りたいのですが。
QueueHammer 2010年

@QueueHammer ROMジョンスキート自身、それは...そうですdevblogs.microsoft.com/csharpfaq/...
レナードAB

74

また、使用することが有用であり得るString.Format、例えば

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

17
コードは1つのライナーと長い説明よりも長く話すので、これが最良の答えです。
Phil

4
var text = "Ann@26"

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

2

それを行うにはいくつかの方法があります。最も簡単なのは\t、テキストでの使用です。ただし、nugetパッケージ\tなど、一部の状況では機能しない可能性がありPdfReportます。


4
\t機能しない場合にタブを追加する方法に関する情報を追加すると便利です。;)
J.スコットエルブレイン

2

を使用してMicrosoft Winform controls、以下で説明する少しの回避策なしに問題を正しく解決することは不可能です。

問題

単に"\t"またはを使用vbTabする際の問題は、複数のTextBoxが表示され、その配置がすべてのTextBoxで尊重される必要がある場合、ONLY "\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

表示されます

ここに画像の説明を入力してください

ご覧のとおり、のageFrançois-Victorは右にシフトし、age他の2つの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.