我正在嘗試在表單上動態顯示 datagridview 中的一些資料(以編程方式添加 DGV)。我嘗試了幾乎所有的屬性組合,但我無法消除右側和底部的灰色區域。

這是我在表單加載時設定的屬性
With dgv
.DataSource = dTable
.Dock = DockStyle.None
.AllowUserToAddRows = False
.AllowUserToOrderColumns = False
.AllowUserToDeleteRows = False
.AllowUserToResizeColumns = False
.AllowUserToResizeRows = False
.EditMode = DataGridViewEditMode.EditProgrammatically
.RowHeadersVisible = False
.DefaultCellStyle.WrapMode = False
.ColumnHeadersVisible = True
.SelectionMode = DataGridViewSelectionMode.CellSelect
.MultiSelect = True
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
.BorderStyle = BorderStyle.None
.ColumnHeadersDefaultCellStyle.Font = New Font("Segoe UI", 8)
.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing
width = 0
For i As Integer = 0 To .ColumnCount - 1
.Columns(i).DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft
.Columns(i).SortMode = DataGridViewColumnSortMode.NotSortable
.Columns(i).DefaultCellStyle.Font = New Font("Segoe UI", 8)
width = .Columns(i).Width
Next i
.AutoResizeColumns()
.AutoResizeRows()
Dim height As Integer = .ColumnHeadersHeight
For i As Integer = 0 To .Rows.Count - 1
height = .Rows(i).Height
.Rows(i).Resizable = False
Next i
.AutoSize = True
.Width = width
.Height = height - 8
end width
有什么建議可以解決問題嗎?
uj5u.com熱心網友回復:
好的,所以我使用的是使用以下命令來調整 datagridview 的大小:
DataGridView1.Width = colwidth DataGridView1.RowHeadersWidth
uj5u.com熱心網友回復:
正如我所評論的,我認為它沒有DataGridView“內置”機制來自動調整行的大小以“填充”網格高度。我可能弄錯了,但是,我相信您需要逐行設定行高。我在測驗中看到的所有示例都失敗了。顯然我可能做錯了什么,但是,我覺得在網格填充資料后粗略地“計算”行高應該不會太困難。
對于總行數總是小于網格高度的網格,下面的代碼應該可以填充網格高度并洗掉底部的“灰色”區域。
如果網格有許多行已經填充或超出網格高度,那么下面的代碼將調整行的大小,使行應該均勻地適合(或接近適合)在網格行區域中。換句話說,它不應該在行的中間“砍掉”最后一行,它應該緊貼網格的底部。
要獲得行高可能看起來像......
Dim rowHeightDouble As Double = (dgv.Height - dgv.ColumnHeadersHeight) / dgv.DisplayedRowCount(False)
Dim rowHeight As Int32 = CInt(Int(rowHeightDouble))
For Each row As DataGridViewRow In dgv.Rows
row.Height = rowHeight
row.MinimumHeight = rowHeight
Next
rowHeight計算方法是將網格的高度減去列標題高度并將該數字除以網格中“顯示”的行數。然后我們遍歷所有行并設定每行的高度。
注意:顯然,這種rowHeight從顯示行數中得到的劃分可能不會平均劃分到網格的高度。示例:假設網格的行區域高度為 188,那么……如果顯示 9 行……那么,除法后 (188 / 9 = 20.88) 表示行高為 20,余數為 8。所以這將顯示 8最后一行下方的“灰色”空間像素。
因此,為了在不顯示垂直滾動條的情況下使行盡可能靠近網格底部排列,我們可以在網格的最后一行添加 8 個像素以消除“灰色”區域。顯然,您也可以向前 8 行添加 1 個像素,但是我采用了懶惰的方法并將其全部添加到最后一行。這可能看起來像……
If (dgv.Rows.Count = dgv.DisplayedRowCount(False)) Then
Dim lastRowBuff As Int32 = CInt(Int((dgv.Height - dgv.ColumnHeadersHeight) - (rowHeight * dgv.DisplayedRowCount(False))))
dgv.Rows(dgv.DisplayedRowCount(False) - 1).Height = rowHeight lastRowBuff
End If
我希望這是有道理的并有所幫助。使用您發布的代碼,我將網格更改AutoSizeColumnsMode為……
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
然后我在第一個for回圈后轉儲了所有內容并用上面的代碼替換它。

With dgv
.DataSource = dTable
.Dock = DockStyle.None
.AllowUserToAddRows = False
.AllowUserToOrderColumns = False
.AllowUserToDeleteRows = False
.AllowUserToResizeColumns = False
.AllowUserToResizeRows = False
.EditMode = DataGridViewEditMode.EditProgrammatically
.RowHeadersVisible = False
.DefaultCellStyle.WrapMode = DataGridViewTriState.False
.ColumnHeadersVisible = True
.SelectionMode = DataGridViewSelectionMode.CellSelect
.MultiSelect = True
'.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.AllCells
.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
.AutoSizeRowsMode = DataGridViewAutoSizeRowsMode.AllCells
.BorderStyle = BorderStyle.None
.ColumnHeadersDefaultCellStyle.Font = New Font("Segoe UI", 8)
.ColumnHeadersHeightSizeMode = DataGridViewColumnHeadersHeightSizeMode.DisableResizing
'Width = 0
For i As Integer = 0 To .ColumnCount - 1
.Columns(i).DefaultCellStyle.Alignment = DataGridViewContentAlignment.TopLeft
.Columns(i).SortMode = DataGridViewColumnSortMode.NotSortable
.Columns(i).DefaultCellStyle.Font = New Font("Segoe UI", 8)
'Width = .Columns(i).Width
Next i
Dim rowHeightDouble As Double = (dgv.Height - dgv.ColumnHeadersHeight) / dgv.DisplayedRowCount(False)
Dim rowHeight As Int32 = CInt(Int(rowHeightDouble))
For Each row As DataGridViewRow In dgv.Rows
row.Height = rowHeight
row.MinimumHeight = rowHeight
Next
If (dgv.Rows.Count = dgv.DisplayedRowCount(False)) Then
Dim lastRowBuff As Int32 = CInt(Int((dgv.Height - dgv.ColumnHeadersHeight) - (rowHeight * dgv.DisplayedRowCount(False))))
dgv.Rows(dgv.DisplayedRowCount(False) - 1).Height = rowHeight lastRowBuff
End If
End With
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/352822.html
下一篇:Xml反序列化為物件,反射為型別
