datagridview将cellstyle应用于单元格

时间:2010-02-03 17:03:50

标签: vb.net winforms datagridview

我使用此示例在winforms应用程序中为DataGridView创建DateTime列。

http://msdn.microsoft.com/en-us/library/7tas5c80.aspx

我可以在Windows窗体设计器中看到新列,并将其添加到现有的DataGridView中。 但是,当我在设计器中更改“DefaultCellStyle”时,我希望能够更改显示格式。

设计器生成的代码如下所示:

    DataGridViewCellStyle1.Format = "t"
    DataGridViewCellStyle1.NullValue = Nothing
    Me.colDate.DefaultCellStyle = DataGridViewCellStyle1
    Me.colDatum.Name = "colDate"
    Me.colDatum.Resizable = System.Windows.Forms.DataGridViewTriState.[False]

哪个好。但由于DataGridViewCalendarCell的代码在构造函数中执行此操作:

    Public Sub New()
        Me.Style.Format = "d"
    End Sub

格式永远不会更改为“t”(时间格式)。 我没有找到如何将格式从拥有列应用到我使用这个woraround atm:

    Public Overrides Function GetInheritedStyle _
            (ByVal inheritedCellStyle As _
                  System.Windows.Forms.DataGridViewCellStyle, _
            ByVal rowIndex As Integer, ByVal includeColors As Boolean) _
    As System.Windows.Forms.DataGridViewCellStyle

        If Me.OwningColumn IsNot Nothing Then
            Me.Style.Format = Me.OwningColumn.DefaultCellStyle.Format
        End If

        Return MyBase.GetInheritedStyle(_
            inheritedCellStyle, rowIndex, includeColors)

    End Function

然而,由于这只是一个黑客攻击,我想知道哪个是“应该如何”将默认的cellstyle从DataGridViewColumn应用到其单元格。有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我会删除构造函数。问题是构造函数是隐含的创建样式。因此,将不使用默认样式的格式。这实际上是一种“资源匮乏”,因为每个单元格都有自己的风格,而不是所有的单元格都有相同的风格。

删除构造函数将解决您的问题,但如果您希望默认为“短日期”,则可能覆盖GetFormattedValue是更好的实现。如下例。我想强调它只是一个例子。你必须弄清楚细节。

    Protected Overrides Function GetFormattedValue( _
        ByVal value As Object, _
        ByVal rowIndex As Integer, _
        ByRef cellStyle As System.Windows.Forms.DataGridViewCellStyle, _
        ByVal valueTypeConverter As System.ComponentModel.TypeConverter, _
        ByVal formattedValueTypeConverter As System.ComponentModel.TypeConverter, _
        ByVal context As System.Windows.Forms.DataGridViewDataErrorContexts) As Object

        If (cellStyle IsNot Nothing) OrElse (String.IsNullOrEmpty(cellStyle.Format)) Then
            'no format specified, so default to short date
            cellStyle.Format = "d"
        End If

        Return MyBase.GetFormattedValue(value, rowIndex, cellStyle, valueTypeConverter, formattedValueTypeConverter, context)

    End Function