2009-10-22 82 views
9

我有一个窗体和DataGridView。我在运行时填充DataGridView,所以我想知道如何根据DataGridView的大小动态调整窗体大小?有没有什么财产或方法?还是我必须自己确定尺寸并相应更新?C#自动调整窗体大小DataGridView的大小

+0

请问您如何“自己确定尺寸”?我只需要知道DGV“想要”的像素数量。 (我可以设置合理的限制来阻止表单变得太大。) – billpg 2010-01-05 11:55:31

回答

3

通常,控件将其大小调整为包含表单的大小。要将表单的大小调整为DataGridView的大小,您必须自行确定大小,然后设置表单的大小以匹配,记住要考虑表单菜单条所需的额外大小和/或工具栏,状态栏或其他控件。

就你而言,最好不要调整窗体大小来匹配网格视图控件。很可能,网格视图中的行数可能会超过Windows屏幕上的行数,并且您不希望在可见桌面区域下面添加表单。一般来说,这种情况正是你想要有一个可滚动的网格视图的原因 - 用于查看比在屏幕上可以适合的更多数据。

+2

“要调整表单大小以适应DataGridView的大小,您必须自己确定大小” 有没有办法做到这一点请?我的DataGridView只有几个单元格,它是只读的。调整表格大小并不成问题,除非我不知道DGV需要多少像素。 非常感谢。 – billpg 2010-01-05 11:54:12

6

您可以通过计数列宽查找实际宽度。

不要忘记你的表格可能更复杂,你应该计算其他控件。

public class YourForm : Form 
{ 
    public YourForm() 
    { 
     DataGridView _dgv = new DataGridView() { Dock = DockStyle.Fill}; 
     Controls.Add(_dgv); 
    } 
    public void CorrectWindowSize() 
    { 
     int width = WinObjFunctions.CountGridWidth(_dgv); 
     ClientSize = new Size(width, ClientSize.Height); 
    } 
    DataGridView _dgv; 
} 

public static class WinObjFunctions 
{ 
    public static int CountGridWidth(DataGridView dgv) 
    { 
     int width = 0; 
     foreach (DataGridViewColumn column in dgv.Columns) 
      if (column.Visible == true) 
       width += column.Width; 
     return width += 20; 
    } 
} 
1

我会去其他方向和大小的网格形式。 (一些用户可能拥有较低的资源) 设置form =>最大化的'WindowState'属性。 (可选) 设置DGV的'anchor'属性=>'上,下,左,右'。

1

您可以使用PreferredSize属性(MSDN PreferredSize entry)。对于DataGridView控件,我发现首选的宽度和高度比我预期的要大20个单位。我想控制可能会考虑滚动条来计算它的首选大小。

我发现的另一个警告是PreferredSize计算在添加或更改表中的项目后不会立即准确。为了解决这个问题,我为RowHeadersWidthChanged事件做了一个处理程序。

这里是我工作:

class GridToy { 
    private DataGridView grid; 
    public GridToy(DataGridView dgv) { 
     grid = dgv; 
     grid.RowHeadersWidthChanged += AdjustWidth; // Event handler. 
     Layout(); 
    } 

    public void Layout() { 
     // Just do some arbitrary manipulation of the grid. 
     grid.TopLeftHeaderCell.Value = "Some Arbitrary Title"; 
    } 

    public void AdjustWidth() { 
     Control horizontal = grid.Controls[0]; // Horizontal scroll bar. 
     Control vertical = grid.Controls[1]; // Vertical scroll bar. 
     grid.Width = grid.PreferredSize.Width - vertical.Width + 1; 
     grid.Height = grid.PreferredSize.Height - horizontal.Height + 1; 
    } 
} 
+0

我不确定RowHeadersWidthChanged是否是最好的事件来听,但它似乎完成工作。 – amacleod 2012-11-07 23:55:14

+0

嗯。进一步的实验表明'PreferredSize'也考虑了行标题的宽度,即使'RowHeadersVisible'为false。看起来手工拼凑尺寸总和会更可靠。 – amacleod 2012-11-08 16:42:10

-1

dataGridView1.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);

希望这有助于:)

2
int dgv_width = dataGridView1.Columns.GetColumnsWidth(DataGridViewElementStates.Visible); 
int dgv_height = dataGridView1.Rows.GetRowsHeight(DataGridViewElementStates.Visible); 
this.Width = dgv_width; 
this.Height = dgv_height; 

this.Width调整其大小,形态的宽度。

当然,您必须添加固定值(例如边距,表格标题高度,等等)。 随着测试中,我已经达到了我工作的值(不要问为什么...):

this.Width = dgv_width + 147; 
this.Height = dgv_height + 47; 
0

你可以分类或使用的ID后的“高度”属性设置为自动的形式和这应该这样做,,

我刚试过..和它的工作

#form1{ 
background-color:white; 
height:auto;        
width:1500px;    
border-top:medium solid #3399FF; 
margin-top:100px; 
margin-left:30px; 
display: inline-block; 
text-align: center;     
float: none;  
} 

我只是把正是我在你迷路的情况下做了。不要担心其他特性还有我的设计。

-1

在网格属性中设置AutoSizeColumnsMode :Fill