0

デフォルトのプリンターで複数行の TextBox を印刷しています。PrintDialog を使用して、プリンターの選択肢を提供したいと思います。設定すると、PrintDialog が表示され、プリンターを選択しますが、[OK] を押すと、常に既定のプリンターに移動します。どんなアイデアでも大歓迎です。適切なコードを含めました。

private void printTreeViewToolStripMenuItem_Click(object sender, EventArgs e) //---added 6-29-12
    {
        textTreeView.Clear();

        CreateRowsFromNode(treeView1.Nodes[0], 0, "");

        //InitPrint(textTreeView.Text).Print();

        printDialog1.Document = InitPrint(textTreeView.Text);

        if (printDialog1.ShowDialog() == DialogResult.OK)
        {
            InitPrint(textTreeView.Text).Print();
        }
    }

もともと PrintDialog はなく、InitPrint(textTreeView.Text).Print() を呼び出すだけでした。上記のように printDialog1 が追加されました。

textTreeView は、印刷される TextBox です。textTreeView テキスト ボックスの各行には、CreateRowsFromNode で作成されたノード テキスト値が保持されます。

InitPrint は次のようになります。

string TextToPrint; //---added 6-29-12
    public PrintDocument InitPrint(string TextToPrint)
    {
        this.TextToPrint = TextToPrint;
        PrintDocument PD = new PrintDocument();
        PD.OriginAtMargins = true;
        PD.DefaultPageSettings.Landscape = true; //---added 6-29-12
        PD.PrintPage += PrintPage;
        return PD;
    }


public void PrintPage(object sender, PrintPageEventArgs e) //---added 6-29-12
    {
        int Chars = 0;
        int Lines = 0;
        Font Font = new Font("Courier new", 9);
        //Font Font = new Font("Arial", 10);
        Rectangle R = new Rectangle(Point.Empty, e.MarginBounds.Size);
        StringFormat SF = StringFormat.GenericTypographic;
        e.Graphics.MeasureString(TextToPrint, Font, R.Size, SF, out Chars, out Lines);
        e.Graphics.DrawString(TextToPrint, Font, Brushes.Black, R, SF);
        TextToPrint = TextToPrint.Substring(Chars);
        e.HasMorePages = (TextToPrint.Length > 0);
    }

TreeView を textTreeView に読み込むコードは次のとおりです。

private void CreateRowsFromNode(TreeNode node, int level, string L = "") //---added 6-29-12
    {

        string data = "";
        string CurrentArrow = null;
        string NextArrow = "";

        //if root then no arrows needed
        if (node.Parent == null) {
            CurrentArrow = "";
            NextArrow = "";
        //if Not Last node of parent
        }
        else if (!(node.Parent.Nodes[node.Parent.Nodes.Count - 1] == node))
        {
            CurrentArrow = "├";

            NextArrow = "│";
        // is last node of parent
        } else {
            CurrentArrow = "└";
            NextArrow = " ";

        }
        //Add the next node to the TextBox
        if (node.Text.Length >= 115)
            textTreeView.Text = textTreeView.Text + L + CurrentArrow + node.Text.Substring(0,115) + vbNewLine;
        else
            textTreeView.Text = textTreeView.Text + L + CurrentArrow + node.Text + vbNewLine;

        //Add the Next Arrow to Left Part of string
        L = L + NextArrow;

        //Loop Through all its child nodes
        foreach (TreeNode nod in node.Nodes) {
            CreateRowsFromNode(nod, level + 1, L);
        }
    }
4

1 に答える 1

0

ここPrinterSettings.InstalledPrintersでMSDNのようにオプションを使用してみてください

**PrintDialog.PrinterSettings - Specifies information about how a document is printed, including the printer that prints it, when printing from a Windows Forms application.**
于 2012-07-02T14:05:23.260 に答える