vb.net自定义控件问题

来自:    更新日期:早些时候
vb.net自定义控件的事件问题~

题外话,从JAVA转过来的,为什么不用C#,毕竟JAVA和C#接近
添加事件处理程序借助设计器就可以了.我下面说的是如何用代码处理
在用户控件的构造函数Sub New()里添加代码注册事件处理函数
AddHandler ToolStripMenuItem1.Click, AddressOf MyHandler
然后实现这个处理函数
Sub MyHandler(sender As Object, e As EventArgs)
'在这里处理这个菜单命令
End Sub

mytest1是继承自什么类,通常应该继承自UerControl,虽然你这样也能编译通过,但实际上没有任何意义。所以你先改了再说。继承之后,编译,工具箱就会多这么个控件,拖动到Form1上,这样按钮下就不用再new了。然后你再来问。

首先,你已经完成的步骤是:
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。

大体的思路就是这样,
主要就是实现的问题了。


vb.net自定义控件问题视频

相关评论:
  • 15079442464自已用 VBNET 2010 做的控件,想添加一个开发模式下的右键菜单如何做...
    凌贝策那个绝对不是自定义控件,这东西叫 ContextMenuStrip,把背景和图片处理一下,然后右键显示,在鼠标位置显示代码如下:private void C1FlexGrid1_MouseDown(object sender, MouseEventArgs e) { if (MouseButtons == MouseButtons.Right) { Point p = new Point(); p.X = e.Location.X...

  • 15079442464(vb.net)动态添加的控件如何多次响应事件?
    凌贝策熟悉VB的朋友对使用ActiveX控件一定不会陌生,众多控件极大地方便了编程,但 唯一的缺陷是不能动态加载控件,必须在设计时通过引用,将控件放置在窗体上。VB6.0已能够解决该问题,只是帮助中没有明确说明,并且没有描述到一些关键功能,由于以前的版本中可以动态创建进程外服务:如果对象是外部可创建的,可...

  • 15079442464vbnetwinsock控件在哪个位置
    凌贝策在工具箱上右击->自定义工具箱->在com组件中找到vbnetwinsock控件。VB中使用方法是工程-部件-MicrosoftWinsockControl6.0然后把工具条中的MWC控件拖入窗体中也可以直接双击。

  • 15079442464vb.net 动态生成的控件,事件也动态加,怎么做呢?
    凌贝策你需要的应该是反射,类似如下,我测试通过的:Imports System.ReflectionPublic Class Form1 Public Sub MMMToolStripMenuItem_Click(sender As Object, e As EventArgs) Handles MMMToolStripMenuItem.Click MsgBox("menu click") End Sub '在按钮事件处理里面通过反射名称调用相应菜单事件 ...

  • 15079442464学过vb6.0一点,转vb.net难吗?
    凌贝策部分一样。安装中文版的vs,每个关键词、属性、方法都有中文说明。定义变量和赋值差不多一模一样,比如下面:1、dim 变量名 as 类型。声明一个变量。2、Dim 变量名() as 类型。声明一个数组 3、Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 按钮点击事件...

  • 15079442464vb.net 绘图,重绘知识
    凌贝策继承(Inherits)控件就可以重写它的属性和方法,图标可以在paint中重绘,用gdi,工具主要在drawing和drawing2d中。combobox弹出的框增加图标吗?个人看法可能需要得到那个句柄,才可以重绘,但那个好像是一体的,不知道能不能弄到句柄。textbox可以自定义高度。只是以行高度为单位,改变字体大小即可,没必要...

  • 15079442464vb.net怎样在checklistbox控件中显示两列
    凌贝策设置MultiColumn属性为True

  • 15079442464vb.net中treeview控件用法
    凌贝策也可以完全自定义 TreeView 控件的外观。若要执行此操作,请将 DrawMode 属性设置为 TreeViewDrawMode.Normal 以外的值并处理 DrawNode 事件。注意 在运行时设置 CheckBoxes、Scrollable、ImageIndex 和 SelectedImageIndex 属性时,将重新创建 TreeView 句柄(请参见 Control.RecreateHandle)以更新控件的...

  • 15079442464vb.net中如何给datagridview的每个combobox单元格指定独立的下拉列表...
    凌贝策1、首先新建一个Windows应用程序,将主窗体重命名为MainForm,在MainForm中加入一个DataGridView控件,命名为dgv_User。 2、打开窗体代码窗口,在代码窗口中声明一个ComboBox的控件 \/\/ 定义下拉列表框 private ComboBox cmb_Temp = new ComboBox(); 3、方法: \/\/\/ \/\/\/ 绑定下拉列表框 \/\/\/ private void Bind...

  • 15079442464【vb.net】get 和 set的简单程序
    凌贝策看样子应该是设置和读取某个物件的属性。。而这个属性就是sslStatus.Text的值。在这里Get是将sslStatus.Text这个结果读取出来;而Set(ByVal value As String)是将value这个参数值赋值给sslStatus.Text,也即是让这个名为sslStatus的文本框显示value这个值。

  • 相关主题精彩

    版权声明:本网站为非赢利性站点,内容来自于网络投稿和网络,若有相关事宜,请联系管理员

    Copyright © 喜物网