最近我写了一个自定义DataGridViewColumn来托管进度条。列类本身有一个属性,我想传播到列的所有单元格。我使用此代码来实现它: -
<DefaultValue(5I)> _
Public Property BlockWidth() As Integer
Get
Return _blockWidth
End Get
Set(ByVal value As Integer)
_blockWidth = value
Me.ColumnCells.ForEach(Sub(cell) cell.BlockWidth = value)
End Set
End Property
这个: -
Private ReadOnly Property ColumnCells As IEnumerable(Of DataGridViewProgressBarCell)
Get
If Me.DataGridView IsNot Nothing Then
Return Me.DataGridView.Rows.
Cast(Of DataGridViewRow).
Where(Function(r) TypeOf r.Cells.Item(Me.Index) Is DataGridViewProgressBarCell).
Select(Function(r) DirectCast(r.Cells.Item(Me.Index), DataGridViewProgressBarCell))
Else
Return New DataGridViewProgressBarCell() {}
End If
End Get
End Property
现在这在运行时工作。如果我在运行时更改列的BlockWidth属性,列的所有单元格都将更改以反映属性更改,但我似乎无法在设计时使其工作。在设计时,单元格不会改变,属性更改仍然存在,但单元格不会更改。我尝试了各种各样的技巧,但它拒绝工作。请有人能告诉我我做错了吗?
答案 0 :(得分:0)
尝试使用datagridview下的Cell Formatting子。您可以以编程方式设置要显示的内容。
请参阅:
Datagridview customization and formatting
希望这有帮助!
答案 1 :(得分:0)
没关系。我想到了。我必须在传递给列对象的构造函数的单元格模板(通过列类的CellTemplate属性)对象上设置BlockWidth属性。另外,我忘了在进度条的单元类中克隆BlockWidth属性。
<DefaultValue(5I)> _
Public Property BlockWidth() As Integer
Get
Return _blockWidth
End Get
Set(ByVal value As Integer)
_blockWidth = value
'For changes to be reflected at runtime
Me.ColumnCells.ForEach(Sub(cell) cell.BlockWidth = value)
'For changes to be reflected at design time
Me.Template.BlockWidth = _blockWidth
If Me.DataGridView IsNot Nothing Then
Me.DataGridView.InvalidateColumn(Me.Index)
End If
End Set
End Property
感谢大家的意见和答案。 :)