如何获取适合一行的字符数(打印c#)

时间:2012-02-18 23:25:13

标签: c# printing

我已经有了这段代码,但它给了我错误的结果。

    private void document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
    int charPerLine = e.MarginBounds.Width / (int)e.Graphics.MeasureString("m", txtMain.Font).Width;
    }

txtMain是一个文本框。

1 个答案:

答案 0 :(得分:2)

这应该可以解决问题。将变量转换为整数时要小心。如果Width属性小于1,您将在零开始时将自己打开为零除零。你的应用程序可能不太可能有这么小的字体,但它仍然是一种很好的做法。

private void document_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
    if( (int)e.Graphics.MeasureString("m", txtMain.Font).Width > 0 )
    {

        int charPerLine = 
            e.MarginBounds.Width / (int)e.Graphics.MeasureString("m", txtMain.Font).Width;
    }
}

真正的问题是,为什么你甚至需要知道每行的字符数。除非你试图做某种ASCII艺术,否则你可以使用Graphics.DrawString的不同重载来让GDI +在一个边界矩形内为你设置文本,而不需要知道一行上有多少个字符。

This sample from MSDN向您展示了如何执行此操作:

// Create string to draw.
String drawString = "Sample Text";

// Create font and brush.
Font drawFont = new Font("Arial", 16);
SolidBrush drawBrush = new SolidBrush(Color.Black);

// Create rectangle for drawing.
float x = 150.0F;
float y = 150.0F;
float width = 200.0F;
float height = 50.0F;
RectangleF drawRect = new RectangleF(x, y, width, height);

// Draw rectangle to screen.
Pen blackPen = new Pen(Color.Black);
e.Graphics.DrawRectangle(blackPen, x, y, width, height);

// Set format of string.
StringFormat drawFormat = new StringFormat();
drawFormat.Alignment = StringAlignment.Center;

// Draw string to screen.
e.Graphics.DrawString(drawString, drawFont, drawBrush, drawRect, drawFormat);

因此,如果您要打印一页文字,只需将drawRect设置为e.MarginBounds,然后为drawString插入一页有关文字的页面。

另一方面,如果您尝试打印表格数据,则可以将页面划分为矩形 - 每列(每行一个)(然而您需要它),并使用e.Graphics.DrawLine重载来打印表格边框

如果您发布有关实际尝试实现内容的更多详细信息,我们可以提供更多帮助。