VB6 to VB.NET conversion - System.Collections.IEnumerator
I have a fairly lengthly block of code that I'm trying to convert from VB6 to VB.NET. The ArcObjects GIS code basically looks at a table and groups a bunch of GIS layers together and adds them to the ArcMap table of contents. I'm having trouble with this line when testing it in Visual Studio 2010:
The VB6 line was this:
Dim pEnumVar As IEnumVersionInfo, value As Varient
Add I was told it needed to be converted to this:
Dim pEnumVar As System.Collections.IEnumerator, value As Object 'I also tried value as String
Also, I had to change this line(4x):
value = pEnumVar.Next
To this:
value = pEnumVar.Current 'and I tried this value = pEnumVar.MoveNext
The VB6 version "value" was returning a string, and the .NET version "value" is returning a "" or null. How do I get "value" to return a string? Here is the long code.
Thanks
Dim pLayer As ILayer
Dim pGrpLayer As IGroupLayer
Dim pStdTableColl As IStandaloneTableCollection
Dim pStdTable As IStandaloneTable = Nothing
Dim pTable As ITable = Nothing
Dim pTableSort As ITableSort
Dim pTblSortLyrs As ITableSort
Dim pRowLyrs As IRow
Dim pDataStat As IDataStatistics
Dim pCursor As ICursor
Dim pLyrCursor As ICursor
Dim pQf As IQueryFilter
Dim lngFldLayerName As Long
Dim lngFldPath As Long
Dim lngFldGroupOrder As Long
Dim lngFldGroupName As Long
Dim lngFldGroupTOCOrder As Long
Dim lngFldGroupVis As Long
Dim i As Integer
Dim strLayerName As String
Dim strPath As String
Dim lngGroupTOCOrder As Long
Dim blnGroupVis As Boolean
Dim pEnumVar As IEnumVersionInfo, value As Object ' <<<<<<<<<<<<<<<<<<
Dim pODGSLyr As New ODGSLayer
'Start
'Find the Layer Files metadata table
pStdTableColl = m_pMap
For i = 0 To pStdTableColl.StandaloneTableCount - 1
pStdTable = pStdTableColl.StandaloneTable(i)
If pStdTable.Name = "ODGSLAYERS" Then
pTable = pStdTable
lngFldLayerName = pTable.FindField("LAYERNAME")
lngFldPath = pTable.FindField("PATH")
lngFldGroupOrder = pTable.FindField("GROUPORDER")
lngFldGroupName = pTable.FindField("GROUPNAME")
lngFldGroupTOCOrder = pTable.FindField("GROUPTOCORDER")
lngFldGroupVis = pTable.FindField("GROUPVISABLE")
End If
Next i
If pStdTable Is Nothing Then
Exit Sub
End If
'Sort the Table
pTableSort = New TableSort
With pTableSort
.Fields = "GROUPTOCORDER, GROUPNAME"
.Ascending("GROUPTOCORDER") = True
.Ascending("GROUPNAME") = True
.QueryFilter = Nothing
.Table = pTable
End With
pTableSort.Sort(Nothing)
pCursor = pTableSort.Rows
'Find Unique Values in the Table
pDataStat = New DataStatistics
pDataStat.Field = "GROUPNAME"
pDataStat.Cursor = pCursor
pEnumVar = pDataStat.UniqueValues
value = pEnumVar.Current ' <<<<<<<<<<<<<<<<<<<<<<<<<<
Do Until IsDBNull(value)
'Now resort the t开发者_开发技巧able based upon the layer order in the group
pQf = New QueryFilter
pQf.WhereClause = "[GROUPNAME] = '" & value & "'"
pLyrCursor = pTable.Search(pQf, False)
pTblSortLyrs = New TableSort
With pTblSortLyrs
.Fields = "GROUPORDER"
.Ascending("GROUPORDER") = True
.QueryFilter = pQf
.Table = pTable
End With
pTblSortLyrs.Sort(Nothing)
'Get the newly sorted rows and create the new Group and Layers inside the Group
pLyrCursor = pTblSortLyrs.Rows
pRowLyrs = pLyrCursor.NextRow
'Create the new Group
lngGroupTOCOrder = pRowLyrs.Value(lngFldGroupTOCOrder)
blnGroupVis = pRowLyrs.Value(lngFldGroupVis)
pGrpLayer = New GroupLayer
pGrpLayer.Visible = blnGroupVis
pGrpLayer.Expanded = False
pGrpLayer.Name = pRowLyrs.Value(lngFldGroupName)
'Add layers to the new Group
Do Until pRowLyrs Is Nothing
strLayerName = pRowLyrs.Value(lngFldLayerName)
strPath = pRowLyrs.Value(lngFldPath)
pODGSLyr = New ODGSLayer
pLayer = pODGSLyr.LoadLayer(strPath, strLayerName)
pGrpLayer.Add(pLayer)
pRowLyrs = pLyrCursor.NextRow
Loop
'Add the Group layer to the map
m_pMap.AddLayer(pGrpLayer)
m_pMap.MoveLayer(pGrpLayer, lngGroupTOCOrder)
' Debug.Print "value - " & value & vbTab & "GroupVis = " & blnGroupVis
value = pEnumVar.Current ' <<<<<<<<<<<<<<<<<<
Loop
Iterating over an object looks like this:
While iterator.MoveNext() Do
val=iterator.Current
'do work with val here
End While
What you're doing is calling Current
without first moving the iterator in place (and then calling Current
at the end for no reason).
By the way, that whole mess is equivalent to:
For Each val in list 'or whatever the source object is
' use val
Next
精彩评论