2010-02-22 51 views
9

在我的一種形式中,datagridview顯示來自數據庫的數據(當然數據的數量(所以行數)可以改變)。數據庫連接處於表單加載事件中。我只是無法弄清楚整個datagridview的高度是如何自動調整的,具體取決於它顯示的行數。winforms:datagridview:height(autosize)取決於行數

回答

4

如果設置DataGridView.AutoSize == true,那麼隨着添加更多行,網格變長。否則,你會得到滾動條。除非你設置了ScrollBars == Null ||水平,在這種情況下,行將消失在結尾。

出於某種原因,DataGridView.AutoSize只能以編程方式設置。當你把網格放入一個可自動化的控件時,會出現一些奇怪的行爲。它似乎沒有響應網格的大小。

我結束了從列,行,標題,邊距,填充和邊框尺寸計算網格的預期大小,然後調整包含網格的控件的大小並將網格固定在四邊。感覺非常笨重,但這是我能想到的最好的。如果你還在附近,評論,我會看看我能否找到代碼,我手邊沒有。

9

這是我好不容易纔找到,並且它運行良好,到目前爲止:

int GetDataGridViewHeight(DataGridView dataGridView) 
{ 
    var sum = (dataGridView.ColumnHeadersVisible ? dataGridView.ColumnHeadersHeight : 0) + 
       dataGridView.Rows.OfType<DataGridViewRow>().Where(r => r.Visible).Sum(r => r.Height); 

    return sum; 
} 

多虧了這一點,我封裝我在用戶控件的DataGridView這樣我就可以正確地執行自動調整大小:

// This is in a user control where the datagrid is inside (Top docked) 
protected override void OnResize(EventArgs e) 
{ 
    if (AutoSize) 
    { 
     var height = this.GetDataGridViewHeight(this.dataBoxGridView); 
     this.dataBoxGridView.Height = height; 
     this.Height = height +this.Padding.Top + this.Padding.Bottom; 
    } 
} 

我沒有嘗試(但)直接從DataGridView構建自定義控件來實現此目的。

+0

這對我很有效,但我必須在+符號前加上括號。我相信這是使用?/:操作符的「操作順序」問題。 – 2014-09-18 04:52:31

+0

好點。我添加了括號來消除有關這種棘手運算符優先級的疑問。 – Larry 2014-09-18 06:13:40

0

這就是我所做的。設置DataGridView的高度,你可以使用它的Set Height屬性。在表單加載中,你可以使用這段代碼來隱藏datagridview。 dataGridViewName.Height = 0;

然後從數據庫中獲取行時。我們可以使用下面的方法根據行數獲取datagridview Height。

private int dataGridViewHeight() 
    { 
     int sum = this.dataGridViewName.ColumnHeadersHeight; 

     foreach (DataGridViewRow row in this.dataGridViewName.Rows) 
      sum += row.Height + 1; // I dont think the height property includes the cell border size, so + 1 

     return sum; 
    }