Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.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# 打印时将字符串对齐到列中_C# - Fatal编程技术网

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

C# 打印时将字符串对齐到列中,c#,C#,我试图将一些字符串对齐到列中,但打印预览总是显示类似的内容 Artikelnr. Name Gewicht (kg) Menge Einheit 1 Dog 1 10 kg 2 Cat 1 8 kg 3 Horse 1 22 kg 前两列看起来不错,但之后的一切都搞砸了 这是代码的样

我试图将一些字符串对齐到列中,但打印预览总是显示类似的内容

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);

是否有更好的方法打印项目列表中的数据?可能将其放入数据表或其他什么东西?

问题是空格字符的大小与您使用的字体中的其他字符不同。简单的解决方法。。。使用单间距字体

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

要解决此问题,请计算列的最大宽度(通过计算每个列项目),然后
DrawString
每个列项目。当你移动到第2列时,你必须为你想要的列大小添加一个偏移量。

该死,你太快了!不幸的是,这没有什么区别。@Lahey-不相信你,你能看到字体的变化吗?是的,我能看到字体的变化,但输出保持不变(除了字体已经改变)。在调试和检查字符串时,文本可视化工具会给我正确的输出。打印预览可能有问题吗?编辑:打印到.xps,同样的问题。我将字符串分成两部分,分别打印。不知怎么的,这解决了问题。