我有如下代码,找到名为“ Model”的类别属性,此后,我将获得模型的名称。
但是您可以看到“ parent”属性显示了参数的上层。我在参数组中的参数及其级联。而且我不知道他们目前在哪个级别上使用以下代码,但这还不够,因为如果我在较低级别上有一个参数,则必须编写elseif条件。
是否有任何快速的解决方案可以使它变得更简单,更明智?
Public Class ParameterInfoClass
Public Shared Sub GetSubvar(ByVal ParameterGroups As IScrNamedObjectList)
Dim ParameterGroup As IScrParameterGroup
Dim nParameterGroup As Integer
Dim ParameterClass As String
nParameterGroup = ParameterGroups.count
For i As Integer = 0 To nParameterGroup - 1
ParameterGroup = ParameterGroups.item(i)
If ParameterGroup.parent.category.name = "Model" Then
ParameterClass = ParameterGroup.parent.name
ElseIf ParameterGroup.parent.parent.category.name = "Model" Then
ParameterClass = ParameterGroup.parent.parent.name
ElseIf ParameterGroup.parent.parent.parent.category.name = "Model" Then
ParameterClass = ParameterGroup.parent.parent.parent.name
'...
'This should be continue like this because i don't know in which level i will find the category name as "Model"
'.
End If
DataGridView1.Rows.Add(ParameterClass, ParameterGroup.name)
Next
End Sub
End Class
使用正确的解决方案来制作此部分非常好。我以为“ do-while循环”可能是一种选择,但我不知道如何应用,因为在写模型的名称之后,重点是在这里查找上层参数以查找“模型”类别。
For i As Integer = 0 To nParameterGroup - 1
ParameterGroup = ParameterGroups.item(i)
If ParameterGroup.parent.category.name = "Model" Then
ParameterClass = ParameterGroup.parent.name
ElseIf ParameterGroup.parent.parent.category.name = "Model" Then
ParameterClass = ParameterGroup.parent.parent.name
ElseIf ParameterGroup.parent.parent.parent.category.name = "Model" Then
ParameterClass = ParameterGroup.parent.parent.parent.name
'...
'This should be continue like this because i don't know in which level i will find the category name as "Model"
'.
End If
答案 0 :(得分:1)
我没有太多时间去研究细节,但是递归是我喜欢的东西,所以我给你一个提示(我会提供更多帮助,但是那是我现在的时间)。
您应该创建一个简单的递归函数,而不是遍历每个可能的父级,而该函数将查找是否找到"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中。
如果有任何疑问,您可以在评论中提出您的问题,我们很乐意为您服务。我喜欢递归!