calcular o preenchimento do datagridview quando o preenchimento for maior que dois?

Este programa de demonstração possui um formulário com um DataGridView desenhado nele

Preenchi o DataGridView com alguns dados

Há algumas respostas aqui que sugerem que se pode calcular a largura total de todas as colunas e adicionar duas, e então você tem a menor largura possível para o DataGridView sem obter barras de rolagem.

Estou descobrindo que nessa situação, por algum motivo, essa largura calculada é muito pequena e as barras de rolagem ainda existem.

Depois de fornecer os dados ao datagridview, eu uso essas 3 linhas.

fix_dgvw_efficientbutnotworking_wrongpadding();

dgvw significa largura do datagridview.

Esse método usa a resposta mencionada por "BOS"ajuste o tamanho do dataGridView ao tamanho total das linhas e colunas No entanto, parece não estar funcionando neste caso.

A propósito, curiosamente, se o datagridview tiver apenas uma linha de dados, o método do BOS funcionará, o preenchimento será então dois. Mas, de qualquer forma, estou interessado neste caso, em que o datagridview possui 2 linhas de dados ... e o método não funciona, pois o preenchimento não é dois.

Você pode ver visualmente (especialmente se você parar aqui e apenas comemorar as próximas duas linhas); nesse ponto, o datagridview possui barras de rolagem.

        MessageBox.Show(test_if_horizontal_scrollbars().ToString());

Esta caixa de mensagens da linha acima, diz True, para indicar que existem barras de rolagem horizontais.

        MessageBox.Show(fix_dgvw_inefficientbutworks().ToString());

A linha acima executa um método que, de maneira ineficiente, continua aumentando a largura da visualização de datagrid até que não haja mais barras de rolagem. Primeiro, ele usa o método do BOS, que obtém a largura para uma largura decente, mas às vezes ainda existem barras de rolagem, como é o caso aqui, e para que esse método aumente a largura, um incremento de cada vez, até que não haja mais barras de rolagem horizontais .

Nesse caso, vemos que o preenchimento teve que ser aumentado mais 15 vezes, vemos o messagebox mostra 15. Mas isso parece ser uma maneira muito ineficiente de descobrir e consertá-lo.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace paddingfind
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {

              //dimensions of one i drew though this doesn't matter
              //dataGridView1.Width = 240;
              //dataGridView1.Height = 150;

        dataGridView1.AllowUserToAddRows = false;

              dataGridView1.ColumnHeadersDefaultCellStyle.Font = new System.Drawing.Font("Courier New", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
                dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
                dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;

                for (int i = 0; i < dataGridView1.Rows.Count; i++)
                    dataGridView1.Rows[i].DefaultCellStyle.Font = new Font("Courier New", 30, FontStyle.Bold);

                //https://stackoverflow.com/questions/9507614/is-it-possible-to-prevent-a-multi-line-headertext-in-a-datagridview
                dataGridView1.ColumnHeadersDefaultCellStyle.WrapMode = DataGridViewTriState.False;


           List<List<string>> colHeaders = new List<List<string>>();

            colHeaders.AddRange(new[]
            { 
               new List<string> {"Column1","Column1"},              
            });

            List<List<string>> lst = new List<List<string>>();

            lst.AddRange(new[]
            {  
               new List<string> { "abc"},
               new List<string> {"abc"}  
            });

            AddColumns(colHeaders);


            dataGridView1.Rows.Add(lst.Count);

            dataGridView1.ColumnHeadersDefaultCellStyle.Font = new System.Drawing.Font("Courier New", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0)));
            dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells;
            dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells;


            dataGridView1.Font = new Font("Courier New", 30, FontStyle.Bold);


            for (int i = 0; i < lst.Count; i++)            
                dataGridView1.Rows[i].Cells[0].Value = lst.ElementAt(i).ElementAt(0);


            fix_dgvw_efficientbutnotworking_wrongpadding();

            MessageBox.Show(test_if_horizontal_scrollbars().ToString());

            MessageBox.Show(fix_dgvw_inefficientbutworks().ToString());

        }



      private void AddColumns(List<List<string>> colHeaders)
        {
            for (int i = 0; i < colHeaders.Count; i++)
                dataGridView1.Columns.Add(colHeaders[i][0], colHeaders[i][1]);
        }

          private bool test_if_horizontal_scrollbars()
      {
          foreach (var scroll in dataGridView1.Controls.OfType<HScrollBar>())

              if (scroll.Visible) return true;

          return false;
      }


      private void fix_dgvw_efficientbutnotworking_wrongpadding()
      {
         // it's not too bad, it sometimes makes it the correct width and sometimes not quite enough, and so it's worth then running the next method that increments the width until there are no more horizontal scroll bars.

          int padding = 2; // clearly wrong here, it seems
          int tw = dataGridView1.Columns.GetColumnsWidth(DataGridViewElementStates.None) + dataGridView1.RowHeadersWidth + padding;
          int th = dataGridView1.Rows.GetRowsHeight(DataGridViewElementStates.None) + dataGridView1.ColumnHeadersHeight;

          dataGridView1.Width = tw;
      }


      private int fix_dgvw_inefficientbutworks()
      {

            // not that inefficient when you run the above method first

          int minpadding = 2; //min  or at least the min that default can possibly be
          int tw = dataGridView1.Columns.GetColumnsWidth(DataGridViewElementStates.None) + dataGridView1.RowHeadersWidth + minpadding + 2;
          int th = dataGridView1.Rows.GetRowsHeight(DataGridViewElementStates.None) + dataGridView1.ColumnHeadersHeight;
          //int dgvw = dgv.Width;
          //int dgvh = dgv.Height;

          dataGridView1.Width = tw;

          int count = 0;
          while (true)
          {
              bool done = false;

              foreach (var scroll in dataGridView1.Controls.OfType<HScrollBar>())
                  if (scroll.Visible) { dataGridView1.Width += 1; count++; } else done = true;

              if (done == true) break;
          }

          return count;  // not important to return coutn but anyhow.
      }


    }


}

questionAnswers(0)

yourAnswerToTheQuestion