当padding大于2时,计算datagridview的填充?

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

我已经用一些数据填充了DataGridView

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

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

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

fix_dgvw_efficientbutnotworking_wrongpadding();

dgvw代表datagridview的宽度。

该方法使用“BOS”中提到的答案将dataGridView大小调整为行和列的总大小但是,在这种情况下它似乎不起作用。

顺便说一句,有趣的是,如果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> colHeaders = new List<List>(); colHeaders.AddRange(new[] { new List {"Column1","Column1"}, }); List<List> lst = new List<List>(); lst.AddRange(new[] { new List { "abc"}, new List {"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> 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()) 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()) if (scroll.Visible) { dataGridView1.Width += 1; count++; } else done = true; if (done == true) break; } return count; // not important to return coutn but anyhow. } } }