datagridview 将单元​​格样式应用于单元格

Posted

技术标签:

【中文标题】datagridview 将单元​​格样式应用于单元格【英文标题】:datagridview apply cellstyle to cells 【发布时间】:2010-02-03 17:03:49 【问题描述】:

我使用此示例在我的 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

但是,由于这只是一个技巧,我想知道将 DataGridViewColumn 中的默认单元格样式应用于其单元格的“应该如何”完成的方式。有什么建议吗?

【问题讨论】:

【参考方案1】:

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

删除构造函数将解决您的问题,但如果您想默认为“短日期”,那么可能覆盖 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

【讨论】:

以上是关于datagridview 将单元​​格样式应用于单元格的主要内容,如果未能解决你的问题,请参考以下文章

更改 datagridview 行中单个单元格的样式

DataGridView里单元格背景色无法设置

如何在 vb.net 中将 datagridview 单元格样式从默认文本框更改为组合框?

c# datagridview 单个 单元格的样式(即字号或者字体颜色)发生改变时候,触发啥事件???

在 C# 中保存和加载 DataGridView 内容和样式

将 DataGridView 的单个单元格变成 Combobox