0

印刷プレビュー後に「境界線」をリセットするだけです。正しく印刷したいページをプレビューしましたが、印刷すると、「境界線」がリセットされなかったため、空白のページが表示されます。「border=0」はどこに置くべきですか?(「border」はデータグリッドビューの行です)

  private void button5_Click(object sender, EventArgs e)
    {
       PrintDocument pd = new PrintDocument();
        pd.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);           
        PrintPreviewDialog ppd = new PrintPreviewDialog();
        ppd.Document = pd;
        ppd.ShowDialog();

    }
  private void pd_PrintPage(object sender, PrintPageEventArgs e)
    {
  prntt(sender, e);
     }
   public void prntt(object sender, PrintPageEventArgs e)
    {
           for (; border < ViewA.RowCount; border++)
        {
            if (ustsin + yuk > e.MarginBounds.Bottom - 400f)
            {

                e.HasMorePages = true;                  

                return;
            }



            texts = ViewA.Rows[border].Cells["Persons"].Value.ToString();
            ...
            graphics.DrawString(texts, font, Brushes.Black, new RectangleF(e.MarginBounds.Left, ustsin, 115f, 90f));               
            ...

            float hoho = (float)e.Graphics.MeasureString(texts, font, 115, StringFormat.GenericTypographic).Height;
            ...
            var mesele = new float[] { hoho, koko, moko };
            float kapa = mesele.OrderByDescending(s => s).First();

            ustsin += kapa + yuk;             

        }            

        e.HasMorePages = false;
     }

印刷プレビューで印刷ボタンを押したときに閉じることができる場合、その終了イベントでリセットできますか?

編集:私はこれをやった、それはうまくいくようだが、それをxpsに送ると、画面に2ページが表示される. このhttp://i.imgur.com/a9KnkA0.pngのように。このショーを 1 ページにするにはどうすればよいですか?

    private void printDocument1_EndPrint(object sender, PrintEventArgs e)
    {


        border = 0;
    }
4

1 に答える 1

0

最初に設定し0、後でリセットしますppd.ShowDialog();

ppd.ShowDialog();
border = 0;

アップデート

PrintPreviewDialogあなた(および他の多くの人が期待する)ほど多くをサポートしていないように見えます。それはユーザー次第です(プログラマーではありません)。このちょっとしたハックを試すことができます:

//code in your button5_Click
ToolStripButton onePageButton = ((ToolStrip)ppd.Controls[1]).Items[3] as ToolStripButton;
BeginInvoke((Action)(() => onePageButton.PerformClick()));
ppd.ShowDialog();

アップデート

でをインターセプトするClickingにはPrint button、もう少しコードを追加する必要があります。アイテム(印刷ボタン)で発火する前にクリックを検出し、Click確認を求めるメッセージボックスを表示し、re-clickユーザーが同意した場合はアイテムを表示する必要があります。これがあなたのためのコードです:

//Use this class to add message interceptor into your ToolStrip message loop
public class NativeToolStrip : NativeWindow {
    ToolStrip ts;
    bool letClicked;
    protected override void OnHandleChange() {
        base.OnHandleChange();
        Control c = Control.FromHandle(Handle);
        ts = c as ToolStrip;
    }
    protected override void WndProc(ref Message m) {                
      if (m.Msg == 0x202&&!letClicked) {//WM_LBUTTONUP = 0x202
           int x = m.LParam.ToInt32() & 0x00ff;
           int y = m.LParam.ToInt32() >> 16;
           ToolStripItem item = ts.GetItemAt(new Point(x, y));                    
           //check if the first item (the Print Button) is clicked
           if (item != null && ts.Items.IndexOf(item) == 0) {
             if (MessageBox.Show("Do you want to print?", "Print confirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No)
                 return;//discard message
             else {
                    letClicked = true;
                    item.PerformClick();
              }
            }
       }
       base.WndProc(ref m);
       if (letClicked) letClicked = false;
    }
}
//This code should be done somewhere like in your form constructor
//BUT your PrintPreviewDialog should also be declared once in the form scope
//You can also place this in your button5_Click BUT it's not recommended
ToolStrip ts = (ToolStrip)ppd.Controls[1];
new NativeToolStrip().AssignHandle(ts.Handle);
于 2013-10-22T15:21:45.370 に答える