デフォルトのプリンターで複数行の 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);
}
}