Padding von DatagridView berechnen, wenn das Padding größer als zwei ist?

Dieses Demonstrationsprogramm hat ein Formular mit einer darauf gezeichneten DataGridView

Ich habe die DataGridView mit einigen Daten gefüllt

Es gibt hier einige Antworten, die darauf hindeuten, dass man die Gesamtbreite aller Spalten berechnen und zwei hinzufügen kann. Dann haben Sie die kleinstmögliche Breite für die DataGridView, ohne Bildlaufleisten zu erhalten.

Ich stelle fest, dass in dieser Situation aus irgendeinem Grund die berechnete Breite zu klein ist und noch Bildlaufleisten vorhanden sind.

Nachdem ich dem Datagridview seine Daten gegeben habe, benutze ich diese 3 Zeilen.

fix_dgvw_efficientbutnotworking_wrongpadding();

dgvw steht für datagridview width.

Diese Methode verwendet die Antwort "BOS"assen Sie die Größe von dataGridView an die Gesamtgröße von Zeilen und Spalten a Allerdings scheint es in diesem Fall nicht zu funktionieren.

Übrigens ist es interessant, dass wenn die Datagrid-Ansicht nur eine Datenzeile enthält, die BOS-Methode funktioniert und die Auffüllung dann zwei ist. Aber auf jeden Fall interessiert mich dieser Fall, in dem die Datagrid-Ansicht zwei Datenzeilen enthält und die Methode nicht funktioniert, da die Auffüllung nicht zwei ist.

Sie können visuell sehen (insbesondere, wenn Sie hier anhalten und nur die nächsten zwei Zeilen ausfüllen). Sie sehen an dieser Stelle, dass die Datagrid-Ansicht Bildlaufleisten enthält.

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

Diese Nachrichtenbox aus der obigen Zeile sagt "True", um anzuzeigen, dass horizontale Bildlaufleisten vorhanden sind.

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

Die obige Zeile führt eine Methode aus, die die Breite der Datagrid-Ansicht ineffizient erhöht, bis keine Bildlaufleisten mehr vorhanden sind. Es wird zuerst die BOS-Methode verwendet, die die Breite auf eine angemessene Breite bringt, aber manchmal gibt es noch Bildlaufleisten, wie hier, und diese Methode erhöht die Breite schrittweise, bis keine horizontalen Bildlaufleisten mehr vorhanden sind .

In diesem Fall sehen wir, dass der Abstand um das 15-fache erhöht werden musste. In der Nachrichtenbox wird 15 angezeigt. Dies scheint jedoch eine sehr ineffiziente Methode zu sein, um dies herauszufinden und zu beheben.

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


    }


}

Antworten auf die Frage(0)

Ihre Antwort auf die Frage