2016-07-29 86 views
1

此问题在此处并未提到,因为它特别改变了字体。和其他答案有一个解决方案,字体更改后不起作用。更改字体后无法获得最小的datagridview宽度

修复宽度按钮是为了设置datagridview的宽度,所以没有滚动条。

如果我点击添加行,然后修改宽度,然后更改字体,然后修复宽度,然后修复宽度不起作用。因此,为了对其进行标记A,B,C,d

A)添加<行 - WORKS
B)固定宽度< --- WORKS
C)改变字体< --- WORKS
d)固定宽度,< --- FAILS

固定宽度工作在B行,但在D行失败,即在字体更改后失败。

我有一个替代方法来获得最小宽度,我已包括,但他们都没有工作..所以宽度没有得到正确设置。

enter image description here

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 dgvblah1 
{ 
    public partial class Form1 : Form 
    { 
     public Form1() 
     { 
      InitializeComponent(); 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 


      dataGridView1.AllowUserToAddRows = false; // maybe doesn't make a difference here for some reaosn. 

      dataGridView1.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells; 
      dataGridView1.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells; 

      dataGridView1.Columns.Add("Col1", "Col1"); 
       dataGridView1.Rows.Add(1); 

      /* 
      btnaddrow.PerformClick(); 
      btnchangefont.PerformClick(); 
      btnaddrow.PerformClick(); 
      btnfixwidth.PerformClick(); //fail 
      */ 

     } 

     private int seeifworks_get_min_dgv_width_A(DataGridView dgv) 
     { 
      // 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 = dgv.Columns.GetColumnsWidth(DataGridViewElementStates.None) + dgv.RowHeadersWidth + padding + 2; 
      int th = dgv.Rows.GetRowsHeight(DataGridViewElementStates.None) + dgv.ColumnHeadersHeight; 

      return tw; 
     } 

     private int seeifworks_get_min_dgv_width_B(DataGridView dgv) 
     { 
      // http://stackoverflow.com/questions/6651487/programmatically-resize-datagridview-to-remove-scroll-bars 
      // Add two pixels for the border for BorderStyles other than None. 
      var controlBorderWidth = (dgv.BorderStyle == BorderStyle.None) ? 0 : 2; 

      // Return the width of all columns plus the row header, and adjusted for the DGV's BorderStyle. 
      return dgv.Columns.GetColumnsWidth(DataGridViewElementStates.Visible) + dgv.RowHeadersWidth + controlBorderWidth; 

     } 


     private void btnfixwidth_Click(object sender, EventArgs e) 
     { 
      // dataGridView1.Width = seeifworks_get_min_dgv_width_A(dataGridView1); 

      dataGridView1.Width = seeifworks_get_min_dgv_width_B(dataGridView1); 


     } 

     private void btnaddrow_Click(object sender, EventArgs e) 
     { 
      dataGridView1.Rows.Add(1); 
     } 

     private void btnchangefont_Click(object sender, EventArgs e) 
     { 
      dataGridView1.ColumnHeadersDefaultCellStyle.Font = new System.Drawing.Font("Courier New", 14.25F, System.Drawing.FontStyle.Bold, System.Drawing.GraphicsUnit.Point, ((byte)(0))); 

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

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

     } 
    } 
} 

回答

1

当垂直scollbar是不可见的方法工作正常,但如果通过改变喜好和添加行垂直滚动条有可见的,你也应该滚动条的宽度增加列的计算宽度。这里是一个更好的版本,它计算的DataGridView首选宽度的方法:

private int GetPreferredWidth(DataGridView grid) 
{ 
    var border = 0; 
    if (grid.BorderStyle == BorderStyle.FixedSingle) 
     border = 2 * SystemInformation.BorderSize.Width; 
    var vscrollWidth = 0; 
    var vscroll = dataGridView1.Controls.OfType<VScrollBar>().FirstOrDefault(); 
    if (vscroll != null && vscroll.Visible) 
     border += vscroll.Width; 
    var columnsWidth = grid.Columns.GetColumnsWidth(DataGridViewElementStates.Visible); 
    var rowHeadersWidth = 0; 
    if (grid.RowHeadersVisible) 
     rowHeadersWidth = grid.RowHeadersWidth; 
    return columnsWidth + vscrollWidth + rowHeadersWidth + border; 
} 

而且grid.GetPreferredSize(new Size(0, 0)).Width;是一个不错的选择,但它附加一些额外的宽度。如果您不介意额外的宽度,那么额外的大小,您可以使用GetPreferredSize方法。

+0

谢谢,我会尝试一下,我很好奇你怎么知道它是垂直滚动条的大小? – barlop

+0

这不是一个猜测,我测试了你的代码,它工作正常。但是,如果由于行数或大字体而出现垂直滚动条,则说明您的方法无法正常工作。我将它改为上面的方法,现在它有一个垂直滚动条时也能正常工作。 –

+0

很棒..顺便说一句,你错过了rowheaderswidth(这是奇怪的列像第一列之前的东西),我只是补充说。而且你错过了列中的'n',所以我纠正了拼写错误。 – barlop