calcular el relleno de datagridview cuando el relleno es mayor que dos?

Este programa de demostración tiene un formulario con un DataGridView dibujado

He llenado el DataGridView con algunos datos

Aquí hay algunas respuestas que sugieren que uno puede calcular el ancho total de todas las columnas y agregar dos, y luego tiene el ancho más pequeño posible para DataGridView sin obtener barras de desplazamiento.

Estoy descubriendo que en esta situación, por alguna razón, el ancho calculado es demasiado pequeño y todavía existen barras de desplazamiento.

Después de darle a datagridview sus datos, entonces uso estas 3 líneas.

fix_dgvw_efficientbutnotworking_wrongpadding();

dgvw significa ancho de vista de cuadrícula de datos.

Ese método utiliza la respuesta mencionada por "BOS"ajustar el tamaño de dataGridView al tamaño total de las filas y columnas Sin embargo, no parece estar funcionando en este caso.

Por cierto, curiosamente, si la vista de cuadrícula de datos solo tiene una línea de datos, entonces el método de BOS funciona, el relleno es entonces dos. Pero de todos modos, estoy interesado en este caso, donde la vista de cuadrícula de datos tiene 2 líneas de datos ... y el método no funciona, ya que el relleno no es dos.

Puede ver visualmente (especialmente si se detiene aquí y solo sale de las siguientes dos líneas), verá en este punto, la vista de cuadrícula de datos tiene barras de desplazamiento.

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

Este cuadro de mensaje de la línea de arriba, dice True, para indicar que hay barras de desplazamiento horizontales.

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

La línea anterior ejecuta un método que, de manera bastante ineficiente, sigue aumentando el ancho de la vista de cuadrícula de datos hasta que no haya más barras de desplazamiento. Primero utiliza el método de BOS que hace que el ancho sea decente, pero a veces todavía hay barras de desplazamiento, como es el caso aquí, y ese método aumentará el ancho un incremento a la vez, hasta que no haya más barras de desplazamiento horizontal. .

En este caso, vemos que el relleno tuvo que aumentarse otras 15 veces, vemos que el cuadro de mensaje muestra 15. Pero esto parece una forma muy ineficiente de descubrirlo y arreglarlo.

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.
      }


    }


}

Respuestas a la pregunta(0)

Su respuesta a la pregunta