65.9K
CodeProject 正在变化。 阅读更多。
Home

控件的默认属性值

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.78/5 (10投票s)

2010年2月14日

CPOL

2分钟阅读

viewsIcon

51970

downloadIcon

343

一篇文章,描述如何在控件的属性中设置默认值。

引言

这是一篇关于控件(用户控件/继承控件)的小文章,重点介绍如何为控件的属性分配默认值,无论默认值是常量还是变量。

使用 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 特性或提供 ResetPropertyNameShouldSerializePropertyName 方法。不要同时使用两者。

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
© . All rights reserved.