C#Equal Tab Spacing

时间:2014-05-06 18:36:30

标签: c# list

所以我有一个收集客户列表的C#程序。该列表显示客户ID,客户名称和客户电话号码。该列表显示在多行文本框中。我的问题是,允许客户使用名字或姓氏,或者名字的第一个名字,当显示列表时,如果其中一个客户只输了名字和姓氏,那么电话号码就在下一个这个名称而不是其他标签。我将在下面展示我的意思。

enter image description here

请注意,与玛丽和约翰相比,鲍勃安东尼的电话号码是如何关闭的?我将使用什么来确保每个行在选项卡中具有相同的空间?

3 个答案:

答案 0 :(得分:2)

虽然某些类型的数据网格或列表视图可能更合适,但如果您希望将其保留为字符串形式,则可以使用composite formatting features中的某些String.Format - 尤其是对齐标记:

string.Format("{0,-8} {1,-20} {2}", stuff)

负/正表示左/右对齐。请注意,字符串不会被截断,如果您还不知道最大宽度,则必须这样做。

答案 1 :(得分:0)

您应该获得最长项目的长度并在其他项目之后添加空格,以便它们全部相等。顺便说一句,我建议你使用DataGridView作为你的应用程序。像这样:

dataGridView1.Rows.Add(3);
dataGridView1.Rows[0].Cells[0].Value = customer.ID;
dataGridView1.Rows[0].Cells[1].Value = customer.Name;
dataGridView1.Rows[0].Cells[2].Value = customer.Phone;

答案 2 :(得分:0)

正如大家所说的,DataGridView是可重用且易于使用的,而不是截断信息或填充信息,用户可以调整列的大小。如果你仍然想这样做,那么你必须得到每个客户并相应地格式化它:

var text = new StringBuilder();
foreach (var customer in Customers)
{
    var format = String.Format("{0} {1} {2}\n",
        FormatField(customer.Id,6),
        FormatField(customer.Name,20),
        FormatField(customer.Phone,10) // Might need extra formating
        );
    text.Append(format);
}

并格式化:

private string FormatField(object field, int size)
{               
    var value = field.ToString();           
    if (value.Length == size)
        return value;
    return value.Length > size
        ? value.Substring(0,size)
        : value.PadRight(size, ' ');
}

根据您显示它的位置,您会看到一些不一致的内容,例如它们不一样"查看宽度"人物" iii"和" MMM"即使他们有相同的长度。