打印时将字符串对齐到列中

时间:2013-12-09 20:12:17

标签: c#

我正在尝试将一些字符串对齐到列中,但是打印预览总是向我显示类似

的内容
Artikelnr.   Name      Gewicht (kg)  Menge  Einheit
        1    Dog     1          10         kg
        2    Cat    1           8         kg
        3    Horse     1         22          kg  

前两列看起来不错,但之后的所有内容都搞砸了。

这就是代码的样子:

        String header = String.Format("{0, -15} {1, -20} {2, -10} {3, -10} {4, -10}", "Artikelnr.", "Name", "Gewicht (kg)", "Menge", "Einheit");
        e.Graphics.DrawString(header , font, Brushes.Black, e.MarginBounds.Left, rowPosition);
        rowPosition += 20;
        e.Graphics.DrawLine(new Pen(Brushes.Black), new Point(e.MarginBounds.Left, rowPosition), new Point(e.MarginBounds.Right, rowPosition));
        rowPosition += 15;

        font = new Font("Arial", 8);
        String item = String.Empty;
        foreach (var i in activeOrder.OrderItem)
        {
            item += String.Format("{0, 15}     {1, -30} {2, -30} {3, -30} {4, -30}", i.ItemId, i.Item.Name, i.Item.Weight, i.Quantity, i.Item.Unit);
            item += String.Empty;
        }
        e.Graphics.DrawString(item, font, Brushes.Black, e.MarginBounds.Left, rowPosition);

还尝试过这个

        font = new Font("Arial", 8);
        String item = String.Empty;
        foreach (var i in activeOrder.OrderItem)
        {
            item = String.Format("{0, 15}     {1, -30} {2, -30} {3, -30} {4, -30}", i.ItemId, i.Item.Name, i.Item.Weight, i.Quantity, i.Item.Unit);
            e.Graphics.DrawString(item, font, Brushes.Black, e.MarginBounds.Left, rowPosition);
            rowPosition += 15;
        }

我看了几个例子,其中大部分是写入控制台。这有什么不同,或者我在这里遗漏了什么?

干杯!

编辑: 调试时,文本可视化工具为项目字符串提供了正确的输出,但打印预览和打印版本不正确。

            int columnPosition = e.MarginBounds.Left;
        int rowPosition = e.MarginBounds.Top + 300;

        // Item header
        String columnHeaders = String.Format("{0, -15} {1, -20} {2, -10} {3, -10} {4, -10}", "Artikelnr.", "Name", "Gewicht (kg)", "Menge", "Einheit");
        e.Graphics.DrawString(columnHeaders, font, Brushes.Black, e.MarginBounds.Left, rowPosition);
        rowPosition += 20;
        e.Graphics.DrawLine(new Pen(Brushes.Black), new Point(e.MarginBounds.Left, rowPosition), new Point(e.MarginBounds.Right, rowPosition));
        rowPosition += 15;

        font = new Font("Courier", 8);
        String item = String.Empty;
        foreach (var i in activeOrder.OrderItem)
        {
            item += String.Format("{0, -10} {1, -30} {2, -20} {3, -20} {4, -0}", i.ItemId, i.Item.Name, i.Item.Weight, i.Quantity, i.Item.Unit);
            item += Environment.NewLine;
        }
        e.Graphics.DrawString(item, font, Brushes.Black, e.MarginBounds.Left, rowPosition);

是否有更好的方法在项目列表中打印数据?也许将它放入dataTable或其他东西?

1 个答案:

答案 0 :(得分:3)

问题是空格字符与您使用的字体中的其他字符大小不同。简单的修复...使用单倍间距字体。

 font = new Font("Courier", 8);

硬性修复,计算列的最大宽度(通过计算每个列项),然后DrawString每个列项。当您移动到第2列时,您必须为希望列的大小添加偏移量。