如何在设计时使自定义DataGridViewColumn属性工作?

时间:2014-06-24 08:59:11

标签: vb.net properties datagridviewcolumn

最近我写了一个自定义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属性,列的所有单元格都将更改以反映属性更改,但我似乎无法在设计时使其工作。在设计时,单元格不会改变,属性更改仍然存在,但单元格不会更改。我尝试了各种各样的技巧,但它拒绝工作。请有人能告诉我我做错了吗?

2 个答案:

答案 0 :(得分:0)

尝试使用datagridview下的Cell Formatting子。您可以以编程方式设置要显示的内容。

请参阅:

http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.cellformatting(v=vs.110).aspx

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

感谢大家的意见和答案。 :)