自定义格式设置功能允许你:
- 设置非数字、也非日期/时间值的格式;
- 为数值或日期/时间值设置复杂的格式。
本主题说明如何实现一个自定义格式提供程序。
自定义格式设置概念
实现自定义格式提供程序意味着要创建一个方法,此方法将返回已格式化的字符串,并把原有值和格式字符串作为参数。 这样就能实现格式设置逻辑,但是这可以为您提供无限的潜能。 要激活自定义格式设置,需把 FormatInfo.FormatType 属性设置为 FormatType.Custom,把 FormatInfo.Format 属性设置为自定义格式提供程序对象。
要创建一个自定义格式提供程序对象,你需要遵照下列步骤:
- 创建一个实现 IFormatProvider 接口的类。 此接口声明了一个单独的 GetFormat 方法,此方法必须返回一个实现 ICustomFormatter 接口的对象引用。 注意,提供一个实现 IFormatProvider 和 ICustomFormatter 接口的类 —— 是一种公共惯例。 在这种情况下, GetFormat 方法必须只返回一个对当前类接口的引用。
- 实现 ICustomFormatter 接口的 Format 方法。 此方法将格式字符串、值、格式提供程序作为参数,并且必须返回设置了格式的字符串。 格式设置逻辑必须在此方法中实现。
- 初始化 FormatInfo.Format 属性,指派一个实现了 IFormatProvider 接口的对象到该属性。 参阅 支持格式设置机制的成员 主题,了解关于如何访问此属性的信息。
要提供一个自定义格式提供程序所需要编写的代码轮廓在下面给出:
C# | 复制代码 |
---|---|
// implementing a custom formatter object class CustomFormatter : IFormatProvider, ICustomFormatter { // implementing the GetFormat method of the IFormatProvider interface public object GetFormat(System.Type type) { return this; } // implementing the Format method of the ICustomFormatter interface public string Format(string format, object arg, IFormatProvider formatProvider) { // implement formatting logic here - this method must return the formatted string // format and args parameters specify the format string and the original value respectively // ... } } // assigning the custom formatter textEdit1.Properties.DisplayFormat.Format = new CustomFormatter(); textEdit1.Properties.DisplayFormat.FormatType = FormatType.Custom; |
Visual Basic | 复制代码 |
---|---|
' implementing a custom formatter object Class CustomFormatter : Implements IFormatProvider, ICustomFormatter ' implementing the GetFormat method of the IFormatProvider interface Public Function GetFormat(ByVal type As Type) As Object Implements IFormatProvider.GetFormat Return Me End Function ' implementing the Format method of the ICustomFormatter interface Public Function Format(ByVal formatString As String, ByVal arg As Object, _ ByVal formatProvider As IFormatProvider) As String Implements ICustomFormatter.Format ' implement formatting logic here - this method must return the formatted string ' format and args parameters specify the format string and the original value respectively ' ... End Function End Class ' assigning the custom formatter TextEdit1.Properties.DisplayFormat.Format = New CustomFormatter() TextEdit1.Properties.DisplayFormat.FormatType = FormatType.Custom |
下面的两个分段提供了关于创建自定义格式提供程序类的示例: 一个简单的大写/小写字母示例,然后是一个十进制数以二进制形式显示的示例。
注意 |
---|
仅在有必要时才使用自定义格式提供程序,因为它的性能没有标准格式提供程序的性能好。 |
示例 - 改变字符串值的大小写
这个示例创建了一个修改编辑器文本大小写的自定义格式提供程序。 编辑器将遵照指定的格式字符串来显示文本 (FormatInfo.FormatString 属性值)。 这个字符串被作为格式参数传递到 Format 方法。 如果这个参数值是 'u',那么显示值被转换为大写; 如果这个格式字符串是 'l',那么显示值被转换为小写。
参阅 自定义格式设置 主题,了解关于创建自定义格式提供程序的信息。
下面的插图展示了文本编辑器的、在执行示例代码之前和之后的外观。
C# | 复制代码 |
---|---|
// A custom formatter object. class CustomFormatter : IFormatProvider, ICustomFormatter{ // The GetFormat method of the IFormatProvider interface. // This must return an object that provides formatting services for the specified type. public object GetFormat(System.Type type){ return this; } // The Format method of the ICustomFormatter interface. // This must format the specified value according to the specified format settings. public string Format(string format, object arg, IFormatProvider formatProvider){ string formatValue = arg.ToString(); if (format == "u") return formatValue.ToUpper(); else if (format == "l") return formatValue.ToLower(); else return formatValue; } } // ... // Assign the custom formatter to the editors. textEdit1.Properties.DisplayFormat.FormatType = FormatType.Custom; textEdit1.Properties.DisplayFormat.FormatString = "u"; textEdit1.Properties.DisplayFormat.Format = new CustomFormatter(); textEdit2.Properties.DisplayFormat.FormatType = FormatType.Custom; textEdit2.Properties.DisplayFormat.FormatString = "l"; textEdit2.Properties.DisplayFormat.Format = new CustomFormatter(); |
Visual Basic | 复制代码 |
---|---|
' A custom formatter object. Class CustomFormatter : Implements IFormatProvider, ICustomFormatter ' The GetFormat method of the IFormatProvider interface. ' This must return an object that provides formatting services for the specified type. Public Function GetFormat(ByVal type As Type) As Object _ Implements IFormatProvider.GetFormat Return Me End Function ' The Format method of the ICustomFormatter interface. ' This must format the specified value according to the specified format settings. Public Function Format(ByVal formatString As String, ByVal arg As Object, _ ByVal formatProvider As IFormatProvider) As String Implements ICustomFormatter.Format Dim formatValue As String = arg.ToString() If (formatString = "u") Then Format = formatValue.ToUpper() ElseIf formatString = "l" Then Format = formatValue.ToLower() Else Format = formatValue End If End Function End Class ' ... ' Assign the custom formatter to the editors. TextEdit1.Properties.DisplayFormat.FormatType = FormatType.Custom TextEdit1.Properties.DisplayFormat.FormatString = "u" TextEdit1.Properties.DisplayFormat.Format = New CustomFormatter() TextEdit2.Properties.DisplayFormat.FormatType = FormatType.Custom TextEdit2.Properties.DisplayFormat.FormatString = "l" TextEdit2.Properties.DisplayFormat.Format = New CustomFormatter() |
示例 - 以二进制形式显示十进制值
这个示例展示了如何创建一个自定义格式提供程序对象,它以二进制形式显示十进制值,但是仅当格式字符串被设置为“B”时才这样显示。 请参阅 自定义格式设置 主题,了解关于创建自定义格式提供程序的信息。
结果如下图所示。
C# | 复制代码 |
---|---|
// A custom formatter object. public class BaseFormatter : IFormatProvider, ICustomFormatter { // The GetFormat method of the IFormatProvider interface. // This must return an object that provides formatting services for the specified type. public object GetFormat(Type format) { if (format == typeof (ICustomFormatter)) return this; else return null; } // The Format method of the ICustomFormatter interface. // This must format the specified value according to the specified format settings. public string Format (string format, object arg, IFormatProvider provider) { if (format == null) { if (arg is IFormattable) return ((IFormattable)arg).ToString(format, provider); else return arg.ToString(); } if (format == "B") return Convert.ToString(Convert.ToInt32(arg), 2); else return arg.ToString(); } } // ... // Assign the custom formatter to the editor. spinEdit1.Properties.DisplayFormat.FormatType = FormatType.Custom; spinEdit1.Properties.DisplayFormat.FormatString = "B"; spinEdit1.Properties.DisplayFormat.Format = new BaseFormatter(); spinEdit1.Properties.IsFloatValue = false; spinEdit1.EditValue = 10; |
Visual Basic | 复制代码 |
---|---|
' A custom formatter object. Public Class BaseFormatter : Implements IFormatProvider, ICustomFormatter ' The GetFormat method of the IFormatProvider interface. ' This must return an object that provides formatting services for the specified type. Public Function GetFormat(ByVal format As Type) As Object _ Implements IFormatProvider.GetFormat If format.ToString() = GetType(ICustomFormatter).ToString() Then GetFormat = Me Else GetFormat = Nothing End If End Function ' The Format method of the ICustomFormatter interface. ' This must format the specified value according to the specified format settings. Public Function Format(ByVal formatString As String, ByVal arg As Object, _ ByVal provider As IFormatProvider) As String Implements ICustomFormatter.Format If (formatString = Nothing) Then If TypeOf arg Is IFormattable Then Format = CType(arg, IFormattable).ToString(formatString, provider) Else Format = arg.ToString() End If Exit Function End If If (formatString = "B") Then Format = Convert.ToString(Convert.ToInt32(arg), 2) Else Format = arg.ToString() End If End Function End Class ' ... ' Assign the custom formatter to the editor. SpinEdit1.Properties.DisplayFormat.FormatType = FormatType.Custom SpinEdit1.Properties.DisplayFormat.FormatString = "B" SpinEdit1.Properties.DisplayFormat.Format = New BaseFormatter() SpinEdit1.Properties.IsFloatValue = False SpinEdit1.EditValue = 10 |