打印机没有提示

elais12

成员
已加入
2018年7月20日
留言内容
7
编程经验
Beginner
大家好

我已经基于不同的元素(尤其是一个名为Listbox)开发了一个Lite Windows程序"LstAnzeige"在列表框中显示数据库条目。除打印功能外,这非常有效。这意味着,如果我按“打印”按钮,则会出现Windows打印机对话框窗口,在这里我可以选择打印机并打印文档,这是列表框的输出,但工作表都是空的(请参阅附件)。

怎么了?

谢谢你的帮助
C#:
The Defenitions for the printer Function i put into the Form Load Method
 public Form1()
        {
            InitializeComponent();

        }
        private StringReader myReader;

        private void Form1_Load(object sender, EventArgs e)
        {

            for (int i = 0; i < 10; i++)
            {
                LstAnzeige.Items.Add("" + i);

            }
        }

And this is the Code for the Printer Button
protected void CmdPrint_Click(object sender, EventArgs e)
        {
            // Printer Dialog Feld einblenden wo der User den Drucker auswählen und ggf. anpassen kann
            // Und dann ListBox Einträge printen
           PrintDialog.Document = PrintDocument;
            string strText = "";
            foreach (object x in LstAnzeige.Items)
            {
                strText = strText + x.ToString() + "\n";
            }
            myReader = new StringReader(strText);
            if (PrintDialog.ShowDialog() == DialogResult.OK)
            {
                this.PrintDocument.Print();
            }

        }

        protected void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs ev)

        {
            float linesPerPage = 0;
            float yPosition = 0;
            int count = 0;
            float leftMargin = ev.MarginBounds.Left;
            float topMargin = ev.MarginBounds.Top;
            string line = null;
            Font printFont = this.LstAnzeige.Font;
            SolidBrush myBrush = new SolidBrush(Color.Black);
            linesPerPage = ev.MarginBounds.Height / printFont.GetHeight(ev.Graphics);
            // Iterate over the string using the StringReader, printing each line.
            while (count < linesPerPage && ((line = myReader.ReadLine()) != null))
                yPosition = topMargin + (count * printFont.GetHeight(ev.Graphics));
            ev.Graphics.DrawString(line, printFont,
                myBrush, leftMargin,
                yPosition, new StringFormat());
            count++;
        

            // If there are more lines, print another page.
            if (line != null)
                ev.HasMorePages = true;
            else
                ev.HasMorePages = false;
            myBrush.Dispose();
        }

        }
}
 

附件

  • Drucken_2018-08-19_21-46-49.png
    Drucken_2018-08-19_21-46-49.png
    15 KB · Views: 63
  • PrintMessage.png
    PrintMessage.png
    1.8 KB · Views: 63
  • document.pdf
    5.1 KB · Views: 63

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,534
地点
悉尼,澳大利亚
编程经验
10+
当您调试代码时,即设置一个断点并逐行浏览代码,并检查每一步的状态,行为在何处以及与您的预期有何不同?这几乎是一个花言巧语的问题,因为我认为可以说您没有调试代码是可以放心的,因为(如果您遇到的话)问题非常明显。停止您正在做的事情,并学习如何立即调试。这是每个开发人员在解决任何复杂的问题之前都应学习的一项关键技能"hello world".

至于特定的问题,请看一下这段代码:
            while (count < linesPerPage && ((line = myReader.ReadLine()) != null))
                yPosition = topMargin + (count * printFont.GetHeight(ev.Graphics));
            ev.Graphics.DrawString(line, printFont,
                myBrush, leftMargin,
                yPosition, new StringFormat());
            count++;

这就是您编写的代码。实际上是这样的:
while (count < linesPerPage && ((line = myReader.ReadLine()) != null))
{
    yPosition = topMargin + (count * printFont.GetHeight(ev.Graphics));
}

ev.Graphics.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat());
count++;

因为根本没有包含任何花括号,所以仅“ while”语句之后的第一行是循环的一部分。这意味着循环只会继续设置“ yPosition”,直到“ line”等于“ null”为止。此时,它退出循环并绘制“线”,即“空”,您无法在打印页面上看到它。

就像我说的那样,如果您调试了代码,那么您将看到正在发生的事情,问题就很明显了。该代码需要这样写:
while (count < linesPerPage && ((line = myReader.ReadLine()) != null))
{
    yPosition = topMargin + (count * printFont.GetHeight(ev.Graphics));
    ev.Graphics.DrawString(line, printFont, myBrush, leftMargin, yPosition, new StringFormat());
    count++;
}
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,534
地点
悉尼,澳大利亚
编程经验
10+
您的牙套似乎很草率,这可能至少是问题的一部分。在某些地方有单行代码块,并且使用过括号,例如
            foreach (object x in LstAnzeige.Items)
            {
                strText = strText + x.ToString() + "\n";
            }
            myReader = new StringReader(strText);
            if (PrintDialog.ShowDialog() == DialogResult.OK)
            {
                this.PrintDocument.Print();
            }

和其他您没有的地方,例如
            if (line != null)
                ev.HasMorePages = true;
            else
                ev.HasMorePages = false;

不一致总是不好的。不管编码的哪个方面,都选择一种样式并坚持下去。就我个人而言,无论是一行还是多行,我总是用大括号包裹一个块。这样,我永远无法做您在这里所做的事情,而忘了在需要的地方添加括号。如果您不打算在单行代码块上使用大括号,那么请承诺每次都这样做,并且还要正确地缩进代码,这样就可以清楚地知道一行是单行代码块的一部分,何时不是。这样一来,您也不会犯这样的错误,因为很明显,未缩进的代码不是块的一部分,而缩进的代码必须是块的一部分,因此需要大括号。
 

elais12

成员
已加入
2018年7月20日
留言内容
7
编程经验
Beginner
感谢您的回复。我会尝试。我调试了truley和truley,但是它没有意识到循环(我在BP处设置了确切的位置)永远是空的。

现在可以正常工作了,再次感谢您的帮助
 

金西尼

C#论坛主持人
工作人员
已加入
2011年4月23日
留言内容
3,534
地点
悉尼,澳大利亚
编程经验
10+
在这种情况下,您需要提高调试技能。您应该已经看到循环中只有一行,并且DrawString行仅执行了一次,并且那一点“行”为空。也许不是第一步,但肯定要在您发布此处之前,在该方法的第一行上放置一个断点,逐步执行该方法的每一行,并注意该方法中的每个变量。我不知道您该怎么做,也看不到DrawString仅被调用一次并且绘制为null,但是您没有告诉我们这是怎么回事。
 
最佳 底部