vb.net自定义控件问题
自定义控件要求:1.自定义控件中有Groupbox控件一个.2.在GroupBox控件可以动态添加RadioButton控件.(一般最少2个,多则10多个).并且可以动态...
自定义控件要求:
1.自定义控件中有Groupbox控件一个.
2.在GroupBox控件可以动态添加RadioButton控件.(一般最少2个,多则10多个).并且可以动态指定Radiobutton的Text属性.且可以动态调整Radiobutton在Groupbox中的位置.类似于在正常创建表单时往groupbox中添加radiobutton一样.
3.当check指定的RadioButton控件时,自定义控件的一个自定义属性CheckedButton=指定RadioButton在Controls中的索引值.(索引值为RadioButton从上到下或者从左到右排序的序号(比如0,1,2,....).相反当指定CheckedButton的值时,可以Check相应的radioButton.
但是我自定义控件后,后面2项不知道如何做.尝试了,也老是做不对.还烦请高人告知. 展开
1.自定义控件中有Groupbox控件一个.
2.在GroupBox控件可以动态添加RadioButton控件.(一般最少2个,多则10多个).并且可以动态指定Radiobutton的Text属性.且可以动态调整Radiobutton在Groupbox中的位置.类似于在正常创建表单时往groupbox中添加radiobutton一样.
3.当check指定的RadioButton控件时,自定义控件的一个自定义属性CheckedButton=指定RadioButton在Controls中的索引值.(索引值为RadioButton从上到下或者从左到右排序的序号(比如0,1,2,....).相反当指定CheckedButton的值时,可以Check相应的radioButton.
但是我自定义控件后,后面2项不知道如何做.尝试了,也老是做不对.还烦请高人告知. 展开
1个回答
展开全部
首先,你已经完成的步骤是:
1.新建一个用户控件[注意,用户控件(UserControl)不是自定义控件(CustomControl)]
2.给用户控件起个名字(我在此处起名叫 RadioList)
3.在用户控件上画一个 GroupBox,命名为 RadioGroup,
并将其 Dock 属性设置为 Fill
然后,你需要做的是动态增减控件。
如果你以前用过 VB 6,你可能会想到控件数组,
但在此处,你可以直接增删控件。
具体实现如下:
4.在 GroupBox 里画一个 FlowLayoutPanel,命名为 RadioPanel,
将其 AutoScroll 属性设置为 True,即自动显示滚动条,
并设置其 FlowDirection 属性(例如设置为 TopDown)
这样就省去了手动调整 RadioButton 位置的麻烦
5.实现选项的动态增减(以下只是我的思路,你可以发挥一下)
(十分简洁,注释除外):
''' <summary>
''' 创建一个新的 RadioButton。
''' </summary>
Private Function CreateRadio() As RadioButton
Dim NewRadio As New RadioButton
components.Add(NewRadio)
'components 字段由控件设计器自动创建,
'此代码目的是使控件在销毁(Dispose)时能自动销毁 RadioButton
'详情参见 RadioList.Designer.vb
NewRadio.Parent = RadioPanel
'设置容器
AddHandler NewRadio.CheckedChanged, AddressOf RadioButtons_CheckedChanged
'设置事件处理程序
Return NewRadio
End Function
''' <summary>
''' 移除已存在的 RadioButton。
''' </summary>
Private Sub RemoveRadio(ByVal dest As RadioButton)
components.Remove(dest)
dest.Dispose()
End Sub
'无中生有的 RadioButton 的事件处理程序
Private Sub RadioButtons_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
'在此处设置选中项的属性,通过 sender 来确定不同的 OptionButton
'你可以通过将 OptionButton 放在一个列表,
'如 List(Of OptionButton) 中来像数组一样维护选项的次序
'注意,此处需要判断 sender 的 Checked 属性是否为 True
'因为 Changed 是“改变”,而不是“选中”
'例如:
If DirectCast(sender, RadioButton).Checked Then
SelectedIndex = ...
End If
End Sub
1.新建一个用户控件[注意,用户控件(UserControl)不是自定义控件(CustomControl)]
2.给用户控件起个名字(我在此处起名叫 RadioList)
3.在用户控件上画一个 GroupBox,命名为 RadioGroup,
并将其 Dock 属性设置为 Fill
然后,你需要做的是动态增减控件。
如果你以前用过 VB 6,你可能会想到控件数组,
但在此处,你可以直接增删控件。
具体实现如下:
4.在 GroupBox 里画一个 FlowLayoutPanel,命名为 RadioPanel,
将其 AutoScroll 属性设置为 True,即自动显示滚动条,
并设置其 FlowDirection 属性(例如设置为 TopDown)
这样就省去了手动调整 RadioButton 位置的麻烦
5.实现选项的动态增减(以下只是我的思路,你可以发挥一下)
(十分简洁,注释除外):
''' <summary>
''' 创建一个新的 RadioButton。
''' </summary>
Private Function CreateRadio() As RadioButton
Dim NewRadio As New RadioButton
components.Add(NewRadio)
'components 字段由控件设计器自动创建,
'此代码目的是使控件在销毁(Dispose)时能自动销毁 RadioButton
'详情参见 RadioList.Designer.vb
NewRadio.Parent = RadioPanel
'设置容器
AddHandler NewRadio.CheckedChanged, AddressOf RadioButtons_CheckedChanged
'设置事件处理程序
Return NewRadio
End Function
''' <summary>
''' 移除已存在的 RadioButton。
''' </summary>
Private Sub RemoveRadio(ByVal dest As RadioButton)
components.Remove(dest)
dest.Dispose()
End Sub
'无中生有的 RadioButton 的事件处理程序
Private Sub RadioButtons_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
'在此处设置选中项的属性,通过 sender 来确定不同的 OptionButton
'你可以通过将 OptionButton 放在一个列表,
'如 List(Of OptionButton) 中来像数组一样维护选项的次序
'注意,此处需要判断 sender 的 Checked 属性是否为 True
'因为 Changed 是“改变”,而不是“选中”
'例如:
If DirectCast(sender, RadioButton).Checked Then
SelectedIndex = ...
End If
End Sub
追问
你的解答还是有点不能满足我的需要.我贴了图片,再附加解释:
1.建好用户控件RadioList后.在新建窗体时,添加RadioList控件,RadioList控件中的RadioButton控件可以自由增删并移动位置(在设计时自由增删和移动,运行时不能).
2点击某个RadioButton,RadioList的属性SelectedIndex会返回其Index(按顺序从上到下或从左到右为0,1,2...).相反设定SelectedIndex时,相应的RadioButton会Selected.(在设计和运行阶段都必须可以设定).
追答
你要的控件已经做出来了,
但由于字数限制(追问只能回答 999 字……个人觉得不太合理……),
只能把摘要写在下面……
具体代码暂时放在
http://hi.baidu.com/forest93/blog/item/a57a4116ae44295221a4e964.html
在此还请管理员网开一面……
代码比较长,
你可以大概看一下。
反正把代码输进去,
生成一下解决方案就能直接用……
首先,我发现用 FlowLayoutPanel 不便于调整选项的次序,
这一点在插入项目时尤为明显,因此改用 TableLayoutPanel;
其次,在 VS 2010 中,components 变成了一个未使用的字段,
除了占地方以外别无他用,因此使用 List(Of RadioButton) 来维护 RadioButton 的列表,
而在容器销毁的时候,子控件是自动 Dispose 的,所以就没有 components 啥事儿了。
然后,我参考了一下 ListBox,
用一个 ObjectCollection 对象来维护列表项的集合,
并在 RadioList 中用 Items 属性公开。
并从 UITypeDesigner 派生了 RadioListItemsDesigner,
用以在设计时编辑这个 ObjectCollection。
大体的思路就是这样,
主要就是实现的问题了。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询