Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何整齐地对齐文本框中的文本,并在导出到.txt时将其保留_C#_Winforms_Textbox - Fatal编程技术网

C# 如何整齐地对齐文本框中的文本,并在导出到.txt时将其保留

C# 如何整齐地对齐文本框中的文本,并在导出到.txt时将其保留,c#,winforms,textbox,C#,Winforms,Textbox,我有一个愚蠢的小问题,我希望你们能加入你们的经验 我需要一个包含以下(动态)数据的文本框: 但盒子里的文字才是问题所在。 到目前为止,我正在使用名为SB的StringBuilder制作所有这些文本,最后我设置了MyTextBox.text=SB.ToString() 我将标题设置在框内,如下所示: SB.AppendLine("Name\t\Amount:"); SB.AppendLine(name + "\t\t" + amount); TEXT TEXT TEXT TEXT _____

我有一个愚蠢的小问题,我希望你们能加入你们的经验

我需要一个包含以下(动态)数据的文本框:

但盒子里的文字才是问题所在。 到目前为止,我正在使用名为
SB
StringBuilder
制作所有这些文本,最后我设置了
MyTextBox.text
=
SB.ToString()

我将标题设置在框内,如下所示:

SB.AppendLine("Name\t\Amount:");
SB.AppendLine(name + "\t\t" + amount);
TEXT
TEXT
TEXT
TEXT

__________________
Navn        Antal:
SpecSaver           1
MadEyes       1
Gucci       1
__________________
using(var text = new StreamWriter("textfile.txt", false))
{
    text.Write(SB);
}
我在循环中生成如下数据:

SB.AppendLine("Name\t\Amount:");
SB.AppendLine(name + "\t\t" + amount);
TEXT
TEXT
TEXT
TEXT

__________________
Navn        Antal:
SpecSaver           1
MadEyes       1
Gucci       1
__________________
using(var text = new StreamWriter("textfile.txt", false))
{
    text.Write(SB);
}
但它不像我的例子那样整齐地对齐! 如果名称比前一个名称长,则金额将显示在行中完全不同的位置-与前一个名称相比

外汇。像这样:

SB.AppendLine("Name\t\Amount:");
SB.AppendLine(name + "\t\t" + amount);
TEXT
TEXT
TEXT
TEXT

__________________
Navn        Antal:
SpecSaver           1
MadEyes       1
Gucci       1
__________________
using(var text = new StreamWriter("textfile.txt", false))
{
    text.Write(SB);
}
我的第一个问题:我如何防止这种情况?当您需要多行文本框来包含大量数据时,通常会做什么。 我的第二个问题:当我将其导出为.txt文档时,如下所示:

SB.AppendLine("Name\t\Amount:");
SB.AppendLine(name + "\t\t" + amount);
TEXT
TEXT
TEXT
TEXT

__________________
Navn        Antal:
SpecSaver           1
MadEyes       1
Gucci       1
__________________
using(var text = new StreamWriter("textfile.txt", false))
{
    text.Write(SB);
}
它给出了数据的另一个版本,完全不一致。它应该与MyTextBox.Text相同。

以(不完全)回答您的第一个问题。您需要计算字符串中的字符数,而不是为每个字符串使用相同数量的制表符,因为它可能包含一个、两个或多个“制表符”的额外字符。例如,考虑以下两个字符串:

"Hi"
"Hello there"
如果在每个选项卡上添加相同数量的选项卡,则第二个选项卡仍然会更长,假设选项卡为4个空格

您可以在开始添加选项卡之前手动执行此操作,然后只添加足够的选项卡以使长度达到所需的长度,或者您可以使用format语句(请参阅Eoin的答案)


回答你的第二个问题。在计算了初始文本的长度后,您可以添加所需的空格数,而不是制表符数,然后,假设您使用的是非比例字体,数字将始终对齐。

使用固定间距字体实现字符对齐-选择类似于
courier new
的字体作为文本框和打印的字体


请参阅(可能您的消息框显示的是可变间距字体?。

首先,您需要为文本框选择一种字体

接下来,您可以提供一个to
string.Format()
(或至
StringBuilder.AppendFormat

结果:

Title 1             Title 2
Val Col 1 A         Val Col 2 A
Val Col 1 B         Val Col 2 B

您还可以研究.padlift.padrright(int)方法,这些方法在左侧或右侧添加空格以帮助保持对齐


你也可以看看你的字体Curior是guly,但是它的制作使得每个charter都占据了完全相同的空间,比如在其他字体中,我会比a占用更少的空间,如果引起间距问题的只是数字,我可以正确对齐它们

int bigNumber = 1234;
int smallNumber = 5;

string bigNumberString = bigNumber.ToString();
string smallNumberString = smallNumber.ToString();

// This works only in a TextBox with a monospaced font.
textBox1.Text = string.Format("{0,4}\n{1,4}",
    bigNumberString,
    smallNumberString);

// This works in TextBoxes with any font.
textBox1.Text = string.Format("{0}\n{1}",
    bigNumberString,
    smallNumberString.PadLeft(bigNumberString.Length, '\u2007'));

使用string.format或stringbuilder.appendformat只需一步,通过使用{0}格式标识指定填充量,我意识到在我发布之后,我想指出OP需要考虑的步骤。我想你的意思是“可以提供”。