填充大于2时计算datagridview的填充?

时间:2016-06-04 23:15:50

标签: c# winforms datagridview

这个演示程序有一个表格,上面有一个DataGridView

我在DataGridView中填充了一些数据

这里有一些答案表明可以计算所有列的总宽度并添加两个,然后在没有滚动条的情况下为DataGridView提供尽可能小的宽度。

我发现在这种情况下,由于某种原因,计算出的宽度太小,滚动条仍然存在。

在我给datagridview提供数据之后,我就使用了这3行。

fix_dgvw_efficientbutnotworking_wrongpadding();

dgvw代表datagridview的宽度。

该方法使用“BOS”fit dataGridView size to row's and columns's total size提到的答案但是,在这种情况下它似乎不起作用。

顺便说一句,有趣的是,如果datagridview只有一行数据,那么BOS的方法可以工作,那么填充就是两行。但无论如何,我对这种情况感兴趣,其中datagridview有2行数据..并且该方法不起作用,因为填充不是两个。

你可以直观地看到(特别是如果你停在这里并且刚刚接下来的两行),你会看到datagridview有滚动条。

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

上面这行的消息框,表示True,表示有水平滚动条。

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

上面的一行运行的方法相当低效,不断增加datagridview的宽度,直到没有更多的滚动条。它首先使用BOS的方法,它将宽度调整到合适的宽度,但有时仍然有滚动条,就像这里的情况一样,因此该方法将一次增加一个增量的宽度,直到没有更多的水平滚动条。

在这种情况下,我们看到填充必须再增加15次,我们看到消息框显示为15.但这似乎是一种非常低效的查找和修复它的方法。

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


    }


}

0 个答案:

没有答案