c# DataGridView to Bitmap



  • Hello, everyone. We need to convert the table into a picture. The most obvious way I'm doing is to keep every single line of photographs on the sheet and then connect to one big picture. I wrote this code:

                List<byte[]> rowList = new List<byte[]>(); //здесь сохраняем все строки
                for (int i = 0; i < OrderDataGrid.Rows.Count; i++) //вот тут всё идеально работает и прекрасно сохраняется
                //(исключение - если таблица не влезает вся в экран, вылазит исключение. Пока что, не знаю, как с этим разобраться)
                {
                    OrderDataGrid.Rows[i].Selected = true;
                    Size dgvSz = OrderDataGrid.ClientSize;
                    int rw = OrderDataGrid.Rows[i].Index;
                    Rectangle RowRect = OrderDataGrid.GetRowDisplayRectangle(rw, true);
                    using (Bitmap bmpDgv = new Bitmap(dgvSz.Width, dgvSz.Height))
                    using (Bitmap bmpRow = new Bitmap(RowRect.Width, RowRect.Height))
                    {
                        OrderDataGrid.DrawToBitmap(bmpDgv, new Rectangle(Point.Empty, dgvSz));
                        using (Graphics G = Graphics.FromImage(bmpRow))
                        {
                            G.DrawImage(bmpDgv, new Rectangle(Point.Empty, RowRect.Size), RowRect, GraphicsUnit.Pixel);
                            string DesktopFolder = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
                            using (MemoryStream stream = new MemoryStream())
                            {
                                bmpRow.Save(stream, ImageFormat.Bmp);
                                rowList.Add(stream.ToArray());
                            }
                        }
                    }
                }
    
            int TotalHeight = (OrderDataGrid.RowCount * OrderDataGrid.RowTemplate.Height) +
                        OrderDataGrid.ColumnHeadersHeight;
            Bitmap result = new Bitmap(OrderDataGrid.ClientSize.Width, TotalHeight);
            result.SetResolution(100, 100);
    
            TypeConverter tc = TypeDescriptor.GetConverter(typeof(Bitmap));
            Graphics g = Graphics.FromImage(result);
            int btmCount = 0; //счётчик bitmap
            for (int y = 0; y &lt; TotalHeight - OrderDataGrid.RowTemplate.Height; y += OrderDataGrid.RowTemplate.Height)
            {//вот тут происходит какая-то странная магия и всё ломается. Не могу понять, в чём дело
            //Он выдаёт мне результат, но это просто 6 пустых строк
                using (Bitmap tempBitmap = (Bitmap)tc.ConvertFrom(rowList[btmCount]))
                {
                    for (int x = 0; x &lt; OrderDataGrid.ClientSize.Width; x += 1)
                    {
                        g.DrawImage(tempBitmap, x, y);
                    }
                }
                btmCount++;
            }
            string DesktopFolder2 = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            result.Save(Path.Combine(DesktopFolder2 + @"\Folder\", "datagridview.png"), ImageFormat.Png);
    

    result:

    введите сюда описание изображения



  • Found in the google on the first reference... ♪ title of this issue

    //Изменить высоту к оригинальной
    int height = dataGridView1.Height;
    dataGridView1.Height = dataGridView1.RowCount * dataGridView1.RowTemplate.Height;
    

    //Создать битмап и врисовать туда DataGridView
    Bitmap bitmap = new Bitmap(this.dataGridView1.Width, this.dataGridView1.Height);
    dataGridView1.DrawToBitmap(bitmap, new Rectangle(0, 0, this.dataGridView1.Width, this.dataGridView1.Height));

    //Изменить DataGridView назад к оригинальному размеру
    dataGridView1.Height = height;

    //Сохранить в папку
    bitmap.Save(@"D:\Images\DataGridView.png");

    code taken with: https://www.aspsnippets.com/Articles/Convert-Export-DataGridView-to-Bitmap-PNG-Image-in-Windows-Forms-WinForms-Application-using-C-and-VBNet.aspx



Suggested Topics

  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2
  • 2