Как напечатать диаграмму C# с большим количеством страниц - PullRequest
0 голосов
/ 21 июня 2020

У меня уже есть проект C#, но у меня проблема с печатью его диаграмм, когда выходит больше страниц с точками данных, у меня работает полоса прокрутки, когда я начинаю получать больше страниц, чтобы пользователь мог просматривать все данные на всех страницах но я не мог найти, как сделать предварительный просмотр печати, показать их или распечатать их, при нажатии на печать он показывает только первую страницу на предварительном просмотре печати и то же самое при ее распечатке.

это печать код:

     PrintPreviewDialog ppd = new PrintPreviewDialog();

     ppd.Document = this.chart1.Printing.PrintDocument;

     ((Form)ppd).WindowState = FormWindowState.Maximized;

     chart1.Printing.PrintDocument.DefaultPageSettings.Landscape = true;

     
     chart1.Printing.PrintDocument.DefaultPageSettings.Margins.Left = 0;
     chart1.Printing.PrintDocument.DefaultPageSettings.Margins.Right = 0;
     chart1.Printing.PrintDocument.DefaultPageSettings.Margins.Top = 0;
     chart1.Printing.PrintDocument.DefaultPageSettings.Margins.Bottom = 0;

     
     ppd.ShowDialog();

и вот код загрузки диаграммы:

    public void loadChart(string sqlvalue)//load chart method
     {
     
     chart1.ChartAreas[0].AxisY.Maximum = 55;
     chart1.ChartAreas[0].AxisY.Minimum = 35;
     chart1.ChartAreas[0].AxisY.Interval = 5;//control how many lines/Interval 


     chart1.ChartAreas[0].AxisY.ScrollBar.Enabled = true;
     chart1.ChartAreas[0].AxisY.ScaleView.Zoomable = true;

     chart1.ChartAreas[0].AxisX.Minimum = 0;
    // chart1.ChartAreas[0].AxisX.Maximum = 10;
     chart1.ChartAreas[0].AxisX.Interval = 1;

     //X AXES label angle
     chart1.ChartAreas[0].AxisX.LabelStyle.Angle = 60;
         
     da = new SqlDataAdapter(sqlvalue, cn.connect());

     da.Fill(dt);

     this.chart1.DataSource = dt;
     this.chart1.Series["left"].XValueMember = dt.Columns[3].ToString();//date data
     this.chart1.Series["left"].YValueMembers = dt.Columns[1].ToString();//spindle 1 data
     this.chart1.Series["Right"].YValueMembers = dt.Columns[2].ToString();//spindle 2 data

     //label the series lines, Backcolor and forcolor
     chart1.Series[0].LabelBackColor = Color.Red;
     chart1.Series[0].LabelForeColor = Color.White;



     //datapoint marker's color, bordercolor,style and size
     chart1.Series[0].MarkerColor = Color.White;
     chart1.Series[0].MarkerBorderColor = Color.Black;
     chart1.Series[0].MarkerStyle = MarkerStyle.Circle;
     chart1.Series[0].MarkerSize = 8;

     //datapoint marker's color, style and size
     chart1.Series[1].MarkerColor = Color.White;
     chart1.Series[1].MarkerBorderColor = Color.Black;
     chart1.Series[1].MarkerStyle = MarkerStyle.Circle;
     chart1.Series[1].MarkerSize = 8;

     
     chart1.Series[1].LabelBackColor = Color.Blue;
     chart1.Series[1].LabelForeColor = Color.White;

    
     //Chart background lines color
     chart1.ChartAreas[0].AxisX.MajorGrid.LineColor = Color.Silver;
     chart1.ChartAreas[0].AxisY.MajorGrid.LineColor = Color.Silver;

    

     this.chart1.DataBind();
     cn.disconnect();
  
     // enable autoscroll
     chart1.ChartAreas[0].CursorX.AutoScroll = true;//------------
     chart1.ChartAreas[0].AxisX.ScaleView.Zoomable = true;
     chart1.ChartAreas[0].AxisX.ScaleView.Zoom(0, 15);

     
      
     chart1.ChartAreas[0].AxisX.ScrollBar.ButtonStyle = ScrollBarButtonStyles.SmallScroll;

     // set scrollbar small change to the target size
     chart1.ChartAreas[0].AxisX.ScaleView.SmallScrollSize = 15;


     Legend left = new Legend();
     Legend LC = CustomCloneLegend(chart1, left);
     chart1.Legends.Add(LC);

  
     chart1.Padding = Padding.Empty;

     ChartArea CA = chart1.ChartAreas[0];
     CA.Position = new ElementPosition(4,6, 100, 90);
    
    }
    

Спасибо за ваше время и помощь, вот обновление кода диаграммы:

 private static Image MergeImages(List<Image> imageList)
  {
     var finalSize = new Size();
     foreach (var image in imageList)
     {
        if (image.Width > finalSize.Width)
        {
           finalSize.Width = image.Width;
        }
        finalSize.Height += image.Height;
     }
     var outputImage = new Bitmap(finalSize.Width, finalSize.Height);
     using (var gfx = Graphics.FromImage(outputImage))
     {
        var y = 0;
        foreach (var image in imageList)
        {
           gfx.DrawImage(image, 0, y);
           y += image.Height;
        }
     }
     return outputImage;
  }

Второй метод:

 List<Image> ChartsToImages(List<Chart> charts)
  {
     var imageList = new List<Image>();
     foreach (var c in charts)
     {
        using (var ms = new MemoryStream())
        {
           c.SaveImage(ms, ChartImageFormat.Png);
           var bmp = System.Drawing.Bitmap.FromStream(ms);
           imageList.Add(bmp);
        }
     }
     return imageList;
  }

и этот код

     var chartList = new List<Chart> { chart1 };
     var imageList = ChartsToImages(chartList);
     var finalImage = MergeImages(imageList);
     finalImage.Save("D:\\Junk.png", ImageFormat.Png);

Я не уверен, что вы имеете в виду под своим первым комментарием, но я нашел этот код здесь, в разделе «Таблица преобразования в вопросы изображения. этот код преобразует и сохраняет диаграмму на том же количестве страниц, но мне нужно показать их в printpreviewcontrol и распечатать их.

1 Ответ

0 голосов
/ 21 июня 2020

Код ниже относится к начальной и конечной точке подсчета страниц. И символы значений представления сетки - это строка l oop на основе подсчета страницы.

    private int numberOfItemsPerPage = 0;
    private int numberOfItemsPrintedSoFar = 0;

    private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
    {
       
                  

        int height = 480; //page height stating point
        for (int l = numberOfItemsPrintedSoFar; l < dataGridView2.Rows.Count; l++)
        {
            numberOfItemsPerPage = numberOfItemsPerPage + 1;
            if (numberOfItemsPerPage <= 25) // 25 is Page Line Item
            {
                numberOfItemsPrintedSoFar++;

                if (numberOfItemsPrintedSoFar <= dataGridView2.Rows.Count)
                {
                    
                    height += dataGridView2.Rows[0].Height;
                    e.Graphics.DrawString(dataGridView2.Rows[l].Cells[0].FormattedValue.ToString(), dataGridView2.Font = new Font("Book Antiqua", 8), Brushes.Black, new RectangleF(5, height, dataGridView2.Columns[0].Width, dataGridView2.Rows[0].Height));
                    e.Graphics.DrawString(dataGridView2.Rows[l].Cells[1].FormattedValue.ToString(), dataGridView2.Font = new Font("Book Antiqua", 8), Brushes.Black, new RectangleF(170, height, dataGridView2.Columns[0].Width, dataGridView2.Rows[0].Height));
                    e.Graphics.DrawString(dataGridView2.Rows[l].Cells[2].FormattedValue.ToString(), dataGridView2.Font = new Font("Book Antiqua", 8), Brushes.Black, new RectangleF(290, height, dataGridView2.Columns[0].Width, dataGridView2.Rows[0].Height));
                    e.Graphics.DrawString(dataGridView2.Rows[l].Cells[3].FormattedValue.ToString(), dataGridView2.Font = new Font("Book Antiqua", 8), Brushes.Black, new RectangleF(345, height, dataGridView2.Columns[0].Width, dataGridView2.Rows[0].Height));
                }
                else
                {
                    e.HasMorePages = false;
                }

            }
            else
            {
                numberOfItemsPerPage = 0;
                e.HasMorePages = true;
                return;

            }


        }
        numberOfItemsPerPage = 0;
        numberOfItemsPrintedSoFar = 0;

    }



    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...