当前位置:编程学习 > C#/ASP.NET >>

请教如何给自定义控件添加窗体上时给某些属性自动赋值,就如添加button是会自动给text赋值button1,button2

如题,请各位达人支招。不胜感激。 --------------------编程问答-------------------- 在自定义控件的初始化事件中 加上 属性赋值 语句。 --------------------编程问答-------------------- [DefaultValue]特性 --------------------编程问答-------------------- 楼上两位的方法好像不是我想要的,其实,这个问题我在vb版提问了。不过没有人回答。背
http://topic.csdn.net/u/20111222/01/a3fb97be-bb0d-48f1-91b9-949170fb910c.html


如上图,menugroup 是我写的一个导航菜单,menuitem是菜单条目,这是一个简单的类,没有继承而来。menugroup有个集合属性items 是关于menuitem的集合。我现在想要在上图点击添加添加菜单的条目,但不知道怎么让那个属性网格的name自动赋值,比如赋个menuitem1,menuitem2,。。也好。
我试过了让menuitem继承control ,那name属性是可以自动赋值的。
我想只是我不知道设置哪个特性把?

menuitem的代码

Imports System.ComponentModel
Imports System.ComponentModel.Design


''' <summary>
''' 菜单条目
''' </summary>
''' <remarks></remarks>
<Serializable()> _
Public Class MenuItem
    ' Inherits Control
    Private _Text As String
    Private _img As Image
    Private _Name As String
    <NonSerialized()> _
    Private _Owner As MenuGroup
    Private _State As ControlState = ControlState.Normal

    Public Sub New()

    End Sub
    Public Sub New(ByVal Text As String, ByVal Name As String, ByVal Image As Image)
        _Text = Text
        _Name = Name
        _img = Image
    End Sub
    Public Sub New(ByVal text As String, ByVal name As String)
        _Text = text
        _Name = name
    End Sub
#Region " 属性"

    Property State() As ControlState
        Get
            Return _State
        End Get
        Set(ByVal value As ControlState)
            If _State <> value Then
                _State = value
                Invalidate()
            End If
        End Set
    End Property
    ''' <summary>
    ''' 显示文本
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <DefaultValue("")> Property Text() As String
        Get
            Return _Text
        End Get
        Set(ByVal value As String)
            If _Text <> value Then
                _Text = value
                Invalidate()
            End If
        End Set
    End Property
    ''' <summary>
    ''' 条目的图标
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Property Image() As Image
        Get
            Return _img
        End Get
        Set(ByVal value As Image)
            _img = value
            Invalidate()
        End Set
    End Property
    ''' <summary>
    ''' 条目的名称或者说是条目的key
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    <DefaultValue("")> Property Name() As String
        Get
            Return _Name
        End Get
        Set(ByVal value As String)
            _Name = value
        End Set
    End Property

    ''' <summary>
    ''' 拥有本条目的所有者
    ''' </summary>
    ''' <value></value>
    ''' <returns></returns>
    ''' <remarks></remarks>
    Property Owner() As MenuGroup
        Get
            Return _Owner
        End Get
        Set(ByVal value As MenuGroup)
            _Owner = value
        End Set
    End Property
#End Region
#Region "方法"

    ''' <summary>
    ''' 使控件的特定区域无效并向控件发送绘制消息(不一定会马上更新界面)
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Invalidate()

    End Sub
    ''' <summary>
    ''' 强制控件使其工作区无效并立即重绘自己和任何子控件
    ''' </summary>
    ''' <remarks></remarks>
    Public Sub Refresh()

    End Sub
#End Region
End Class
--------------------编程问答-------------------- 加上特性试试 
[Localizable(true)] --------------------编程问答-------------------- 这个属性也不行呢。 --------------------编程问答-------------------- 网上查了好久,总算解决了。贴上来说不定那位后来着就不用想我这么麻烦了。

测试控件 
Imports System.ComponentModel.Design
Imports System.Windows.Forms.Design
Imports System.ComponentModel

<DefaultProperty("Items")> _
Public Class myControl

    Inherits Control

    Dim _items As New List(Of item)

    <EditorAttribute(GetType(myConCollectionEditorDgr), GetType(System.Drawing.Design.UITypeEditor))> _
    ReadOnly Property Items() As List(Of item)
        Get
            Return _items
        End Get
    End Property




    Class item
        Private _name As String
        Private _ID As Int32
        Property Name() As String
            Get
                Return _name
            End Get
            Set(ByVal value As String)
                _name = value
            End Set
        End Property
        Property ID() As Int32
            Get
                Return _ID
            End Get
            Set(ByVal value As Int32)
                _ID = value
            End Set
        End Property
        Public Overrides Function ToString() As String
            Return _ID.ToString
        End Function
    End Class
End Class



继承集合编辑器

Imports System.Windows.Forms.Design
Imports System.ComponentModel.Design

Public Class myConCollectionEditorDgr
    Inherits CollectionEditor

    Dim indexs As New List(Of Integer)
    Dim destroys As New List(Of Integer)

    Sub New(ByVal type As Type)
        MyBase.New(type)
    End Sub
    Protected Overrides Sub DestroyInstance(ByVal instance As Object)
        Dim item As myControl.item = instance

        indexs.Remove(item.ID)
        destroys.Add(item.ID)
        destroys.Sort()
        MyBase.DestroyInstance(instance)
    End Sub
    Protected Overrides Function CreateInstance(ByVal itemType As System.Type) As Object

        Dim item As New myControl.item
        Dim n As Integer = -1
        For Each i As Integer In destroys
            If Not indexs.Contains(i) Then
                n = i
                Exit For
            End If
        Next
        If n = -1 Then n = indexs.Count
        item.ID = n
        indexs.Add(n)
        Return item

        'Dim count As Integer
        'Dim item As New myControl.item

        'If _getItems IsNot Nothing Then
        '    count = _getItems.Count
        'Else
        '    count = 0
        'End If

        'Dim arr(-1) As myControl.item
        'Me.GetItems(arr)
        'Console.WriteLine(arr.Length)
        'item.Name = "item" & count
        'Return item

        ''   here   we   are   making   sure   that   we   generate   a   unique   column   name   every   time   
        'Dim cols As Object()
        'Dim strtmpcolname As String
        '
        'Do
        '    strtmpcolname = "column" & _count.ToString()
        '    Console.WriteLine(strtmpcolname)
        '    cols = Me.GetItems(strtmpcolname)

        '    _count += 1
        'Loop While cols.Length <> 0

        ''   instance   the   column   and   set   its   ident   name   
        'Dim col As Object = MyBase.CreateInstance(itemType)
        'DirectCast(col, myControl.item).Name = strtmpcolname

        'Return col



        ' _count = MyBase.GetItems().Length
        ' Return _count + 1
        'If itemType Is GetType(Integer) Then
        'Dim col As Object = MyBase.CreateInstance(itemType)
        'DirectCast(col, myControl.item).Name = _count.ToString
        '_count += 1
        'Return col
        'Else
        '    Return MyBase.CreateInstance(itemType)
        'End If
    End Function
    ''Protected Overrides Function GetObjectsFromInstance(ByVal instance As Object) As System.Collections.IList
    ''    '_count = MyBase.GetObjectsFromInstance(instance).Count
    ''    _items = MyBase.GetObjectsFromInstance(instance)
    ''    Return _items
    ''End Function
    'Protected Overrides Function GetItems(ByVal editValue As Object) As Object()
    '    ' _count = MyBase.GetItems(editValue).Length
    '    _getItems = MyBase.GetItems(editValue)
    '    Return _getItems
    'End Function
End Class

补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,