用 PropertyGrid 实现 Visual Studio 2005 样式的属性窗口 (Properties Window)

在 Visual Studio 里,有一个很好用的东西,就是属性窗口 (Properties Window),如下图所示。属性窗口列出了一个对象所有可见的属性,你可以浏览和修改属性,非常方便。

如何用 Visual Basic 2005 实现这样一个属性窗口呢?我们可以用 VB 2005 提供一个现成的控件,叫做 PropertyGrid,来实现属性窗口。

PropertyGrid 控件的基本使用

打开 Visual Studio。在文件 (File) 菜单上,单击新建项目 (New Project)。 在新建项目 (New Project) 对话框的模板 (Templates) 窗格中,单击 Windows 应用程序 (Windows Application)。在名称 (Name) 框中键入 PropGrid,再单击确定 (OK)。

在 Solution Explorer 里选中 Form1.vb,改名为 MainForm.vb。

在 Toolbox 的 All Windows Forms 里选中 PropertyGrid 控件,将其拖到 Form 上。在 Properties 窗口将 PropertyGrid 的 Name 属性改为 pgDemo。

这时候的 PropertyGrid 是空的,PropertyGrid 需要关联一个对象,才会有数据。最简单的,MainForm 就是一个对象,我们可以将 MainForm 和 pgDemo 关联起来。

双击 MainForm,到代码编辑画面,使代码如下:

Public Class MainForm
 
    Private Sub MainForm_Load(ByVal sender As System.Object, _
    ByVal e As System.EventArgs) Handles MyBase.Load
 
        '设置名为 MainForm 和 pgDemo 宽和高	
        Me.Width = 500
        Me.Height = 500
        pgDemo.Height = 400
        pgDemo.Width = 400
 
        '将 pgDemo 和 MainForm 对象关联
        pgDemo.SelectedObject = Me
    End Sub
End Class

在 MainForm_Load 里的前面几句代码并不重要,主要是设置显示的宽度和高度。最关键的是下面 一句:

pgDemo.SelectedObject = Me

Me 指的就是 MainForm。这句代码的意思是 pgDemo 所关联的对象是 Me。

PropertyGrid 控件关联自定义对象

上面示例中 PropertyGrid 控件关联的对象是 Form,是个系统内置对象。如何将 PropertyGrid 与自定义的对象关联起来呢?

我们修改一下上面的示例。

首先先创建一个自定义对象。在 Solution Explorer 中选中 PropGrid 节点,按鼠标右键选中 Add 命令,然后选择 Class...,然后将 Name 改成 Demo.vb。在 Solution Explorer 里会出现一个 Demo.vb 的节点。点击 Demo.vb 节点,会出现代码编辑窗口,请在代码编辑窗口拷贝如下代码:

Public Class Demo
 
#Region "Private Variables "
    Private bLocked As Boolean = True
    Private dtCreateDate As Date
    Private strFilePath As String
    Private strFolderPath As String
#End Region
 
#Region "Public Properties"
    Public Property Locked() As Boolean
        Get
            Return bLocked
        End Get
        Set(ByVal value As Boolean)
            bLocked = value
        End Set
    End Property
 
    Public Property CreatDate() As Date
        Get
            Return dtCreateDate
        End Get
        Set(ByVal value As Date)
            dtCreateDate = value
        End Set
    End Property
 
    Public Property FilePath() As String
        Get
            Return strFilePath
        End Get
        Set(ByVal value As String)
            strFilePath = value
        End Set
    End Property
 
    Public Property FolderPath() As String
        Get
            Return strFolderPath
        End Get
        Set(ByVal value As String)
            strFolderPath = value
        End Set
    End Property
 
#End Region
 
End Class

然后在 Solution Explorer 里选中 MainForm.vb 节点,点击鼠标右键,选择 View Code 命令显示代码编辑窗口。

修改 MainForm_Load 事件,修改代码如下:

Private Sub MainForm_Load(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles MyBase.Load
    Me.Width = 300
    Me.Height = 300
    pgDemo.Height = 200
    pgDemo.Width = 200
 
    Dim oDemo As New Demo
    pgDemo.SelectedObject = oDemo
 
End Sub

选择调试 (Debug) 菜单中的开始调试 (Start Debugging),运行该程序。或者直接按快捷键 F5 运行。你会看到如下画面。

在画面的属性窗口中,显示了 oDemo 对象的属性:CreateDate,FilePath,FolderPath,Locked。

当你鼠标点在 CreateDate 值的区域时,会出现一个下拉健,点击下拉键,你会看到一个日历。因为 oDemo.CreateDate 属性是 Date 类型,所以 PropertyGrid 自动会根据对象属性的数据类型给出一个日历控件。同样,Locked 属性是 Boolean,PropertyGrid 根据该属性的数据类型,给出True 和 False 的选择项。

如何在属性值里显示文件对话框和目录浏览对话框

oDemo 对象还有两个属性,oDemo.FilePath,oDemo.FolderPath,当你输入这两个属性的值时,会考虑到,为保证输入值的正确性,最好有像 Windows 那样的打开文件对话框 (OpenFileDialog) 或者目录浏览对话框 (FolderBrowserDialog),你可以从中选择文件或者目录。

要达到这样的功能,你需要修改一下 Demo.vb。

首先,在 Solution Explorer 中双击My Project,选择 Reference,然后点击 Add... 按钮,在 .Net 里选择 System.Design,然后按 OK 健。

然后,请在

Public Class Demo 

这行代码之前加上一行代码:

Imports System.ComponentModel

然后在

Public Property FilePath() As String

这行代码之前加上如下一行代码:

<Editor(GetType(System.Windows.Forms.Design.FileNameEditor), _
GetType(System.Drawing.Design.UITypeEditor))> _

选择调试 (Debug) 菜单中的开始调试 (Start Debugging),运行该程序。或者直接按快捷键 F5 运行。

这时候,乍一看画面没有什么两样。但当时你点击属性 FilePath 的值区域,会出现一个省略号按钮,点击该按钮,会出现打开文件对话框 (OpenFileDialog),如下图 。用 OpenFileDialog 选择某个文件,你会看到属性 FilePath 的值区域里会出现该文件的文件路径。

然后我们要为 FolderPath 加个目录浏览文件框 (FolderBrowserDialog)。在

Public Property FolderPath() As String

这行代码之前加上

<Editor(GetType(System.Windows.Forms.Design.FolderNameEditor), _
GetType(System.Drawing.Design.UITypeEditor))> _

选择调试 (Debug) 菜单中的开始调试 (Start Debugging),运行该程序。或者直接按快捷键 F5 运行。

点击属性 FolderPath 的值区域,会出现 FolderBrowserDialog,如下图。

设置属性类别、说明、是否可见和缺省值

缺省情况下,PropertyGrid 里面出现的所关联对象的属性,都在 Misc 类别里。如果要自定义类别,你可以用 system.ComponentModel.Category 来做。

还是拿上面的例子来说,比如我们要为属性 FilePath 和属性 FolderPath 定一个类别,名字为 Location。

首先,我们还是需要

Imports System.ComponentModel

这句代码。(这句代码在上面示例中已经加过,我们就不需要再加了。)

然后将属性 FilePath 和属性 FolderPath 的代码修改如下:

   <Category("Location"), _
    Editor(GetType(System.Windows.Forms.Design.FileNameEditor), _
    GetType(System.Drawing.Design.UITypeEditor))> _
    Public Property FilePath() As String
        Get
            Return strFilePath
        End Get
        Set(ByVal value As String)
            strFilePath = value
        End Set
    End Property
 
    <Category("Location"), _
    Editor(GetType(System.Windows.Forms.Design.FolderNameEditor), _
    GetType(System.Drawing.Design.UITypeEditor))> _
    Public Property FolderPath() As String
        Get
            Return strFolderPath
        End Get
        Set(ByVal value As String)
            strFolderPath = value
        End Set
    End Property

你会注意到,两个属性声明中各加了一句代码:

Category("Location")

这表示,这两个属性都属于一个叫 Location 的类别。

选择调试 (Debug) 菜单中的开始调试 (Start Debugging),运行该程序。或者直接按快捷键 F5 运行。

显示画面中,如下图,属性 FilePath 和属性 FolderPath 从原来的 Misc 类别中脱离出来,分在另外一个叫 Location 类别里。

 

以下的表格中的各种 Attributes,可分别用来设置属性的类别,说明,是否可见和缺省值。

Attributes说明
Category("CategoryName") or 
CategoryAttribute("CategoryName") 

设置属性的类别。缺省类别是 Misc。

Description("Description") or
DescriptionAttribute("Description") 

设置属性的说明。即ProperyGrid 最下面灰色说明部分。

Browsable(True/False) or 
BrowsableAttribute(True/False) 

设置属性是否可见。缺省值是 True。Browsable(False) 表示属性不可见。

[ReadOnly](True/False) or 
ReadOnlyAttribute(True/False)

设置该属性是否只读。缺省值 False。如果值为 True,该属性值不能修改。

DisplayName("DisplayName") or
DisplayNameAttribute("DisplayName")

如果不设置 DisplayName,属性的标题就是属性的名称,如果设置 DisplayName,属性的标题显示 DisplayName 指定的值 (可以包含空格,中文)。

DefaultValue("Value") or 
DefaultValueAttribute("Value") 

设置属性缺省值。应和属性初始值一样。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值