У меня не так много времени, чтобы копаться в деталях, но рекурсия - это то, что мне нравится, поэтому я даю вам подсказку (я помог бы больше, но сейчас у меня есть время).
Вместо того, чтобы перебирать каждый возможный родительский уровень, вы должны создать простую рекурсивную функцию, которая будет искать, находит ли она "Model"
, затем либо возвращать ее, либо искать своего родителя, вызывая себя для его поиска.
Вы должны использовать эту новую функцию вместо вашей If ElseIf ElseIf...
потенциально бесконечной функции.
Я написал что-то вроде того, что я имею в виду:
Private Function GetParameterClass(rootClassName As rootClass) As String
If ParameterGroup.category.name = "Model" Then
Return ParameterGroup.category.name
End If
If ParameterGroup.parent IsNot Nothing Then
Return GetParameterClass(ParameterGroup.parent)
End If
Return ""
End Function
Вызываяаналогично, вы будете рекурсивно выполнять итерацию по каждому родительскому элементу, пока он не найдет ни одного, и в первый раз, когда он найдет "Model"
, он остановит рекурсию и вернет ее.
Извините, что не уточнилЯ должен вернуться к работе сам!Я посмотрю твою ветку сегодня вечером, когда смогу, на всякий случай.Веселитесь!
РЕДАКТИРОВАТЬ:
Я не знаком с классом, с которым вы работаете, поэтому в этом редактировании есть много догадок.Вот как я бы попытался решить вашу проблему:
Public Class ParameterInfoClass
Public Shared Sub GetSubvar(ByVal ParameterGroups As IScrNamedObjectList)
For Each parameterGroup As IScrParameterGroup In ParameterGroups
Dim parameterClass As String = GetParameterClassName(parameterGroup)
If parameterName <> "" Then
DataGridView1.Rows.Add(parameterClass, parameterGroup.Name)
End If
Next
End Sub
Private Shared Function GetParameterClassName(parameterGroup As IScrParameterGroup) As String
If parameterGroup.category.name = "Model" Then
Return parameterGroup.name
End If
If parameterGroup.parent IsNot Nothing Then
Return GetParameterClass(parameterGroup.parent)
End If
Return ""
End Function
End Class
Основная идея GetParameterClassName
заключается в том, что он либо найдет parameterGroup.category.name = "Model"
, либо вернет пустую строку.Я заменил способ, которым вы планировали выполнять итерацию, на цикл For Each
, который должен хорошо работать с большинством списков, но вам может понадобиться отрегулировать, что часть IScrNamedObjectList
не содержит или не содержит список, массив или что-то еще.
Всякий раз, когда GetParameterClassName
найден, тогда parameterClass
не является пустым, поэтому мы можем добавить эту информацию в DataGridView1.
Вы можете задать свои вопросы в комментариях, если у вас естьлюбой, и я буду счастлив, чтобы обязать.Я люблю рекурсию!