控件的下标可以用变量来表示吗?

Nichol888 2010-06-21 09:27:06
大家好:
控件的下标可以用变量来表示吗?有50个CheckBox,从CheckBox1到CheckBox50。我想检查这50个CheckBox的Checked状态,用VB怎么表示?谢谢!
...全文
128 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
兔子-顾问 2010-06-21
  • 打赏
  • 举报
回复
遍历时候添加即可。要求你的控件名字都是默认的那种后面1,2,3,4,5的。
添加窗体。拖n个CheckBox和一个按钮。粘贴代码即可看效果。

Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim checkbox_list As New List(Of CheckBox)
For Each c As Control In Me.Controls
If Not TypeOf c Is CheckBox Then Continue For
checkbox_list.Add(CType(c, CheckBox))
Next

checkbox_list.Sort(AddressOf CheckBoxComparison)
For i As Integer = 0 To checkbox_list.Count - 1
MessageBox.Show("ComboBox" + (i + 1).ToString() + " : " + IIf(checkbox_list(i).Checked, "选中", "没选中"))
Next
End Sub
Public Function CheckBoxComparison(ByVal x As CheckBox, ByVal y As CheckBox) As Integer
Return String.Compare(x.Name, y.Name, True)
End Function
End Class
Nichol888 2010-06-21
  • 打赏
  • 举报
回复
麻烦你详细讲下怎么把这这50个CheckBox组成一个数组,我是想如果检查到某个CheckBox的Checked为True,我就把这个Checkbox的Text等其他的一组数据插入DB里去。谢谢您1
兔子-顾问 2010-06-21
  • 打赏
  • 举报
回复
你想如何判断呢?找到任何一个为true?还是如何?
vs2005,如果判断是否都选中了。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim all_true As Boolean = True
For Each c As Control In Me.Controls
If Not TypeOf c Is CheckBox Then Continue For
Dim check As CheckBox = CType(c, CheckBox)
If Not check.Checked Then
all_true = False
Exit For
End If
Next
MessageBox.Show(IIf(all_true, "都打钩了", "有的没打钩"))
End Sub
Nichol888 2010-06-21
  • 打赏
  • 举报
回复
“Dim combobox_array As CheckBox() = (From c In Controls.Cast(Of Control)() Order By c.Name Where TypeOf c Is CheckBox Select TryCast(c, CheckBox)).ToArray()”

这一句我不懂,麻烦您详细解释下好吗?谢谢!
Nichol888 2010-06-21
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 wuyazhe 的回复:]
你的vs是什么版本?2005?2008?2010?.net什么版本?2.0?3.0?3.5?4.0?
[/Quote]

谢谢您,我的VS是2005。
兔子-顾问 2010-06-21
  • 打赏
  • 举报
回复
你的vs是什么版本?2005?2008?2010?.net什么版本?2.0?3.0?3.5?4.0?
兔子-顾问 2010-06-21
  • 打赏
  • 举报
回复
我给你的代码就是把这50个控件存入一个数组里了。
Nichol888 2010-06-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 nichol888 的回复:]
引用 2 楼 wuyazhe 的回复:
VB.NET code

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim combobox_array As CheckBox() = (From c In Controls.……
[/Quote]

还有我想问下:怎么把这50个CheckBox组成一个数组呢?
Nichol888 2010-06-21
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 wuyazhe 的回复:]
VB.NET code

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim combobox_array As CheckBox() = (From c In Controls.Cast(Of C……
[/Quote]


非常感谢您!要是这50个CheckBox不是一个数组,又该怎样表示呢?
兔子-顾问 2010-06-21
  • 打赏
  • 举报
回复

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim combobox_array As CheckBox() = (From c In Controls.Cast(Of Control)() Order By c.Name Where TypeOf c Is CheckBox Select TryCast(c, CheckBox)).ToArray()
For i As Integer = 0 To combobox_array.Length - 1
If combobox_array(i).Checked Then
'你的代码
End If
Next
End Sub

看不懂跟帖再说。
马老虎 2010-06-21
  • 打赏
  • 举报
回复
这结贴率 真不低啊!
vb不会 帮顶!
兔子-顾问 2010-06-21
  • 打赏
  • 举报
回复
说错了。。。
c#下是的,
if (obj as MyClass == null )//这个判断最快
vb下应该写 if TryCast(obj,MyClass) is Nothing then

checkbox_list.Sort(AddressOf CheckBoxComparison)
传递个委托,让sort方法来调用CheckBoxComparison以确定先后顺序,因为我只需要按名字排序,那直接用系统提供的string.Compare就可以了。
please_call_me_J 2010-06-21
  • 打赏
  • 举报
回复
If CType(a,CheckBox) <> Nothing Then'这样做比 is 快
如果该对象不是checkbox转换出的来值就会是NOTHING?

还有就是
checkbox_list.Sort(AddressOf CheckBoxComparison) ‘这句我知道是排序,但我看不出和下面的函数的调用是怎么的一个过程,看不出下面函数的作用啊

Public Function CheckBoxComparison(ByVal x As CheckBox, ByVal y As CheckBox) As Integer
Return String.Compare(x.Name, y.Name, True)
End Function
兔子-顾问 2010-06-21
  • 打赏
  • 举报
回复
从效率上说。你和我都用的是 is 方法进行类型判断,类型判断使用的是clr的类型树。(类似这个东西,至于是不是这样叫法不一定了)
书上推崇的高效写法,其实不是很好看。有点丑。所以我很少那么写。高效的话是直接类型转换

For Each a As Control In Me.Controls
If CType(a,CheckBox) <> Nothing Then'这样做比 is 快
Dim check As CheckBox = CType(a, CheckBox)
MsgBox(check.Text & ":" & IIf(check.Checked, "选中", "未选中"))
End If
Next
兔子-顾问 2010-06-21
  • 打赏
  • 举报
回复
1.顺序你就看看设计器如何添加的就明白了。所以才需要按名字排序。
2.效率上没什么区别。
please_call_me_J 2010-06-21
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 wuyazhe 的回复:]
引用 12 楼 juyangjia 的回复:

for each a as checkbox in me.controls
迭代器返回的是Control类型,隐式类型转换为checkbox失败的时候就会有你说的异常

----------------------------


引用 13 楼 nichol888 的回复:
非常感谢!

如果这50个CheckBox从ckb1……
[/Quote]

For Each a As Control In Me.Controls
If a.GetType Is GetType(CheckBox) Then
Dim check As CheckBox = CType(a, CheckBox)
MsgBox(check.Text & ":" & IIf(check.Checked, "选中", "未选中"))
End If
Next


我改了下这样可以了。两个问题,1.为什么顺序是从checkbox10一直到1,而不是从1到10呢?
2.这个代码和您的代码有何区别?效率?
please_call_me_J 2010-06-21
  • 打赏
  • 举报
回复
遍历GROUPBOX把这个For Each c As Control In Me.Controls改成For Each c As Control In Me.groupbox1.Controls
兔子-顾问 2010-06-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 juyangjia 的回复:]
[/Quote]
for each a as checkbox in me.controls
迭代器返回的是Control类型,隐式类型转换为checkbox失败的时候就会有你说的异常

----------------------------

[Quote=引用 13 楼 nichol888 的回复:]
非常感谢!

如果这50个CheckBox从ckb1到ckb50是在GroupBox1里组成checkbox_list1(还有50个CheckBox从cka1到cka50是在GroupBox2里组成checkbox_list2),上面的语句又该怎样呢?谢谢!
[/Quote]

For Each c As Control In Me.Controls

这里的Me换成你的别的父容器即可。

please_call_me_J 2010-06-21
  • 打赏
  • 举报
回复
        For Each a As Control In Me.Controls
If a.GetType Is GetType(CheckBox) Then
Dim check As CheckBox = CType(a, CheckBox)
MsgBox(check.Text & ":" & IIf(check.Checked, "选中", "未选中"))
End If
Next

我改了下这样可以了。两个问题,1.为什么顺序是从checkbox10一直到1,而不是从1到10呢?
2.这个代码和您的代码有何区别?效率?
Nichol888 2010-06-21
  • 打赏
  • 举报
回复
非常感谢!

如果这50个CheckBox从ckb1到ckb50是在GroupBox1里组成checkbox_list1(还有50个CheckBox从cka1到cka50是在GroupBox2里组成checkbox_list2),上面的语句又该怎样呢?谢谢!
加载更多回复(1)

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧