2016-08-07 342 views
1

我想根據它包含的行數量來使我的DataGridView AutoSize的高度。目前,我可以使用以下行來實現:DataGridView自動高度 - 如何自動調整DataGridView高度?

然而,這使得水平滾動條消失,在DataGridView被切斷。

如何在不丟失水平滾動條的情況下自動調整高度?

+2

設置其MaximumSize屬性。 –

+0

@HansPassant我不知道我在測試'MaximumSize'時犯了什麼錯誤,這使我確信它不會工作,但是閱讀您的評論後,我再次嘗試了它,併發揮了作用。是的,設置'新大小(this.dataGridView1.Width,0)'是完全可行的。 –

+0

@HansPassant但是由於當用戶想要改變網格寬度時,使用'MaximumSize'不太友好,我更喜歡在我的答案中使用* Option 1 *或* Option 2 *。 –

回答

3

選項1 - 覆蓋的getPreferredSize

您可以覆蓋的DataGridViewGetPreferredSize方法和使用新建議的大小new Size(this.Width, proposedSize.Height)調用基方法。通過這種方式,控制的電流寬度將保持不變,而自動調整大小規則將其高度適用於:

using System.Drawing; 
using System.Windows.Forms; 
public class MyDataGridView : DataGridView 
{ 
    public override Size GetPreferredSize(Size proposedSize) 
    { 
     return base.GetPreferredSize(new Size(this.Width, proposedSize.Height)); 
    } 
} 

選擇2 - 基於計算的自動大小的高度設置高度

如果您不想從DataGridView派生,則可以通過調用GetPreferredSize並通過new Size(0, 0)來計算自動尺寸,然後將DataGridView的高度設置爲結果的高度,這樣您只能更改DataGridView的高度。你應該設置自動高度RowsAddedRowsRemoved,一些其他活動,如果你需要:

void AutoHeightGrid(DataGridView grid) 
{ 
    var proposedSize = grid.GetPreferredSize(new Size(0, 0)); 
    grid.Height = proposedSize.Height; 
} 
private void Form1_Load(object sender, EventArgs e) 
{ 
    dataGridView1.RowsAdded += (obj, arg) => AutoHeightGrid(dataGridView1); 
    dataGridView1.RowsRemoved += (obj, arg) => AutoHeightGrid(dataGridView1); 
    //Set data source 
    //dataGridView1.DataSource = something; 
} 

如果你想確保在網格中的所有變化,包括改變Font,行的高度將導致調整網格,可以調用Paint事件中的方法。

選項3 - 設置MAXIMUMSIZE

另外,作爲由Hans提到的,如果你不想從DataGridView派生,你可以使用網格的MaximumSize財產。你可以將其設置爲new Size(this.dataGridView1.Width, 0)

dataGridView1.MaximumSize = new Size(this.dataGridView1.Width, 0); 
dataGridView1.AutoSize = true; 

注意

由於使用MaximumSize是不是當用戶想要讓由左,右錨件網格寬度變化非常友好,我喜歡使用選項1選項2

+0

我是否需要創建自己的DataGridView類來完成此任務? – Reeggiie

+0

哇謝謝你這樣詳細的回答。我選擇了2 :) – Reeggiie