在VB.Net如何应用For each

forgetitit 2004-07-29 06:25:51
1、怎么使用For Each?
2、自定义的一个对象objAs,该对象类似于一个数组,可以通过A的接口访问每个子对象。如何使用For Each 获得每个子对象?

如:
for each objB in objAs
...
Next

这在VB中是可以使用的,但将VB的工程升级到VB.Net后,该语句就编译不过去了。到底怎么回事?

...全文
2635 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
forgetitit 2004-07-30
  • 打赏
  • 举报
回复
上面的楼主的意思,是不是指在调用for each时我使用了objAs的无参数默认属性(...in objAs)??那我该如何修改呢?其实是可以直接在For循环中通过索引来实现的,就是我不想那么麻烦。
AntingZ 2004-07-30
  • 打赏
  • 举报
回复
升级建议:解析无参数默认属性

在 Visual Basic 6.0 中,许多对象都公开默认属性,可以将这些属性作为编程快捷方式而忽略。例如,TextBox 的默认属性为 Text,因此不必编写:
MsgBox Form1.Text1.Text
而是使用快捷方式:

MsgBox Form1.Text1
编译代码时,将解析默认属性。另外,还可以将默认属性同后期绑定对象一起使用,如下例所示:

Dim obj As Object
Set obj = Form1.Text1
MsgBox obj
在此后期绑定示例中,默认属性在运行时被解析,MsgBox 将 TextBox 的默认属性的值显示为 Text1。

Visual Basic .NET 不支持无参数默认属性,因此不允许这种编程快捷方式。升级项目后,Visual Basic .NET 解析无参数默认属性,但无法自动解析依赖运行时解析的后期绑定用法。这时,您必须亲自更改代码。另外一种复杂情况是多个库使用名为 _Default 的属性实现默认属性。_Default 作为代理,会将调用传递给真正的默认属性。因此,将项目升级后,某些默认属性将会解析为 _Default。代码仍将照常工作,但将不如使用实际属性显式编写的代码那样易于理解。鉴于这些原因,请尽量避免在 Visual Basic 6.0 代码中使用无参数默认属性。不应编写:

Dim obj As Object
Set obj = Me.Text1
'BAD: Relying on default property
MsgBox obj
'BAD: Relying on default property
MsgBox Me.Text1
而使用:

Dim obj As TextBox
Set obj = Me.Text1
'GOOD: Default property is resolved
MsgBox obj.Text
'GOOD: Default property is resolved
MsgBox Me.Text1.Text
虽然 Visual Basic .NET 中不支持“无参数”默认属性,但支持“带参数”默认属性。如果考虑到参数化的默认属性始终有索引,就会了解这两种类型之间的差异。一个示例是 ADO recordset 的默认属性:Fields 集合。代码:

Dim rs As ADODB.Recordset
rs("CompanyName") = "SomeCompany"
rs!CompanyName = "SomeCompany"
实际是以下代码的快捷方式:

Dim rs As ADODB.Recordset
rs.Fields("CompanyName").Value = "SomeCompany"
rs.Fields!CompanyName.Value = "SomeCompany"
此时,Fields 属性被参数化,因此该用法在 Visual Basic .NET 中有效;但 Fields 属性的默认属性 Value 是无参数的,因此在 Visual Basic .NET 中正确的用法是:

Dim rs As ADODB.Recordset
rs("CompanyName").Value = "SomeCompany"
rs!CompanyName.Value = "SomeCompany"
将项目升级后,此实例以及多数其他的默认属性都会被解析,因此在 Visual Basic 6.0 中将其解析仅是一个很好的编程练习。但是,应避免使用带有 Object 和 Variant 数据类型的默认属性,因为它们无法被解析而且必须您亲自修复已升级项目中的代码。


ms-help://MS.MSDNQTR.2003FEB.2052/vbcon/html/vbconUpgradeRecommendationResolveParameterlessDefaultProperties.htm
forgetitit 2004-07-30
  • 打赏
  • 举报
回复
而这个用法在VB中是可以使用的,但将VB的工程升级到VB.Net后,该语句就编译不过去了。又是怎么回事呢?其实是这样的:在VB中,有如下代码:
dim ObjAs as objCs
dim objB as objC
======begin===
for each objB in objAs
'...
Next
======begin===

其实上面====之间的语句,在VB中可以这么用
dim nIndex as long
for nIndex=1 to objAs.Count
objB = objAs.Item(nIndex)
'...
next

objB和objAs存在着这种关系的。

xue__wen 2004-07-29
  • 打赏
  • 举报
回复
我不知道
SKer 2004-07-29
  • 打赏
  • 举报
回复
我用过,先定义objB是objAs中的成员,然后在for each 一定好用
lxcc 2004-07-29
  • 打赏
  • 举报
回复
for each UpCollections up in YourUpCollection
//循环操作
next
水如烟 2004-07-29
  • 打赏
  • 举报
回复
假如你的对象类为objMy

dim ObjAs() as objMy
...
dim myObj as objMy '这个是用来返回的
dim objB as ojbMy
for each objB in objAs
If objB.A=... Then
myObj=objB
Exit For
End If
Next
wangsaokui 2004-07-29
  • 打赏
  • 举报
回复
本示例使用 For Each...Next 语句搜索集合中所有元素的 Text 属性以查找“Hello”字符串。在该示例中,MyObject 是与文本相关的对象,并且是集合 MyCollection 的一个元素。它们两个都是仅用于说明目的的一般名称。
Dim Found As Boolean = False
Dim MyCollection As New Collection
For Each MyObject As Object In MyCollection ' Iterate through elements.
If CStr(MyObject.Text) = "Hello" Then ' If Text equals "Hello"
Found = True ' Set Found to True.
Exit For ' Exit loop.
End If
Next

16,554

社区成员

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

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