控件的默认属性值
一篇文章,描述如何在控件的属性中设置默认值。
引言
这是一篇关于控件(用户控件/继承控件)的小文章,重点介绍如何为控件的属性分配默认值,无论默认值是常量还是变量。
使用 DefaultValue 特性
如果我们的控件的属性具有常量默认值,我们可以通过 System.ComponentModel
命名空间下的 DefaultValue
特性来设置它。
以下是一个将属性 'MinimumNumber
' 设置为默认值 10 的示例。
Private _MinimumNumber As Integer = 10
<Browsable(True), DefaultValue(10), _
Description("Minimum number of the field.")> _
Public Property MinimumNumber() As Integer
Get
Return _MinimumNumber
End Get
Set(ByVal value As Integer)
_MinimumNumber = value
End Set
End Property
|
|
重置命令“禁用”,因为该值等于默认值。表单的设计器类中不会生成任何代码。 | 重置命令“启用”,因为该值与默认值不同。并且,表单的设计器类中会生成代码。 |
但是,如果默认值不是常量呢?
使用 ShouldSerialize 和 Reset 方法
一个属性可以具有非常量默认值(是的,这是可能的),例如,默认日期。
假设我们想创建一个 DateTime
属性,并将 Today
作为默认值;这样做肯定是不正确的:<Browsable(True), DefaultValue(DateTime.Now.Date))>
。
相反,您必须使用以下代码。
第一部分:属性声明。我已将默认值保存在一个函数中。如果您愿意,也可以使用私有只读属性。
Private _MinimumDate As Date = GetDefaultMinimumDate()
Private Function GetDefaultMinimumDate() As Date
Return DateTime.Now.Date
End Function
<Browsable(True), Description("Minimum date of the field")> _
Public Property MinimumDate() As DateTime
Get
Return _MinimumDate
End Get
Set(ByVal value As DateTime)
_MinimumDate = value
End Set
End Property
第二部分:函数声明。Visual Studio 的表单设计器将自动找到以下方法。请注意,Reset
必须是 Public
方法。否则,上下文菜单中的重置命令将不会启用。
Public Sub ResetMinimumDate()
MinimumDate = GetDefaultMinimumDate()
End Sub
Private Function ShouldSerializeMinimumDate() As Boolean
Return Not (_MinimumDate = GetDefaultMinimumDate())
End Function
假设 Today
是 2010/2/13。
|
|
与默认值相同;ShouldSerializeMinimumDate 返回 False 。 |
与默认值不同。ShouldSerializeMinimumDate 返回 True 。生成设计器代码并启用重置命令。 |
最后...
来自 MSDN:应用 DefaultValue
特性或提供 ResetPropertyName
和 ShouldSerializePropertyName
方法。不要同时使用两者。
XmlSerializer 中还有什么?
我发现 ShouldSerialize
方法也适用于 System.Xml.Serialization.XmlSerializer
。您可以创建此方法来控制是否应将可空值序列化到 XML 中。
如果没有该方法,即使它是 null,元素 Mark
(可空整数类型)也会被序列化。
<?xml version="1.0" encoding="utf-16"?>
<Student xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
mlns:xsd="http://www.w3.org/2001/XMLSchema">
<Name>Tom</Name>
<Mark xsi:nil="true" />
</Student>
有时,如果我正在实现自定义的反序列化器版本,我只想摆脱它。因此,我添加了 ShouldSerialize()
方法。
Public Class Student
Public Name As String
Public Mark As Integer?
Public Function ShouldSerializeMark() As Boolean
Return Mark.HasValue
End Function
End Class