我有一个绑定到业务对象列表的DataGridView:
Dim template As New IncidentTemplate
Dim temps As List(Of IncidentTemplate) = template.LoadAll
Dim bs As New BindingSource
If Not temps Is Nothing Then
bs.DataSource = temps
Me.dgvTemplates.DataSource = bs
End If
然后我添加一个未绑定的按钮列,并使一些绑定列不可见:
Dim BtnCol As New DataGridViewButtonColumn
With BtnCol
.Name = "Edit"
.Text = "Edit"
.HeaderText = String.Empty
.ToolTipText = "Edit this Template"
.UseColumnTextForButtonValue = True
End With
.Columns.Add(BtnCol)
BtnCol = Nothing
For Each col As DataGridViewColumn In Me.dgvTemplates.Columns
Select Case col.Name
Case "Name"
col.DisplayIndex = 0
col.FillWeight = 100
col.Visible = True
Case "Description"
col.DisplayIndex = 1
col.FillWeight = 100
col.Visible = True
Case "Created"
col.DisplayIndex = 3
col.HeaderText = "Created On"
col.DefaultCellStyle.Format = "d"
col.FillWeight = 75
col.Visible = True
Case "CreatedBy"
col.DisplayIndex = 2
col.HeaderText = "Created By"
col.FillWeight = 75
col.Visible = True
Case "Edit"
col.DisplayIndex = 4
col.HeaderText = ""
col.FillWeight = 30
col.Visible = True
Case Else
col.Visible = False
End Select
Next
这似乎工作得相当好,但无论我做什么,按钮列(编辑)总是显示在其他列的中间而不是结尾。我已经尝试了DGV.Columns.Add和DGV.Columns.Insert以及设置列的DisplayIndex(这适用于所有其他列)但我无法使按钮列显示在正确的位置。我也尝试在设置其余列之前和之后添加按钮列,但这似乎没有区别任何人都可以建议我做错了什么?这让我发疯了......
答案 0 :(得分:17)
我在寻找解决类似问题时偶然发现了你的帖子。我最后通过您提及(使用DisplayIndex
属性)并将AutoGenerateColumns
的{{1}}属性设置为false来跟踪它。此属性在设计器中不可见,因此我只是将其添加到表单的构造函数中。在为网格设置数据源之前,请务必执行此操作。
希望这会有所帮助......
答案 1 :(得分:4)
AutoCreateColumn是问题所在。以下文章提供了如何解决它的示例。
来自DataDridView DisplayOrder Not Working
在数据网格视图中设置列的DisplayIndex时,某些列出现故障。要解决这个问题,我必须在设置数据源之前将AutoGenerateColumns设置为true,之后设置为FALSE。
例如:
dgvReservedStalls.AutoGenerateColumns = True
dgvReservedStalls.DataSource = clsReservedStalls.LoadDataTable()
dgvReservedStalls.AutoGenerateColumns = False
答案 2 :(得分:2)
这里也有同样的问题,经过一段时间的搜索后,我发现通过按升序排列DisplayIndexes就可以了。
这是违反直觉的,因为它是一个数字,但我仍然需要按顺序设置它们。
这有效:
With customersDataGridView
.Columns("ContactName").DisplayIndex = 0
.Columns("ContactTitle").DisplayIndex = 1
.Columns("City").DisplayIndex = 2
.Columns("Country").DisplayIndex = 3
.Columns("CompanyName").DisplayIndex = 4
End With
虽然没有:
With customersDataGridView
.Columns("ContactName").DisplayIndex = 0
.Columns("CompanyName").DisplayIndex = 4
.Columns("Country").DisplayIndex = 3
.Columns("ContactTitle").DisplayIndex = 1
.Columns("City").DisplayIndex = 2
End With
答案 3 :(得分:0)
我尝试了上述解决方案但没有成功。然后我发现了这篇文章:它让一切变得更好。