请教如何给自定义控件添加窗体上时给某些属性自动赋值,就如添加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#