I'm trying to retrieve all subtypes for a given feature class. ISubtypes.Subtypes give you an enumeration of all subtypes in the class. However the IEnumSubtype.Next method requires the subtype code to retrieve the associated subtype. But this obviously requires prior knowledge of all subtype codes. There are no methods on ISubtypes that retrieve all subtype codes. So, how do I obtain a list of both the subtype codes and subtype names associated with a feature class? I must be missing something obvious here.
2 Answers
I found a way to retrieve both the subtype codes and subtype names for a feature class using the Geoprocessor. I did not find a way to get the codes directly from ISubtypes, which I find unusual. In any case, the following code will create a Dictionary(Of Integer, String) containing the subtype code as the key and the subtype name as the value:
Dim gp as New Geoprocessor
Dim dtype As Object = ""
Dim dataElem As IDataElement = gp.GetDataElement("C:\Test.gdb\TestFC", dtype)
Dim deTbl As IDEGdbTable = TryCast(dataElem, IDEGdbTable)
Dim dictSubtypes as New Dictionary(Of Integer, String)
Dim arr as IArray = deTbl.Subtypes
For i As Integer = 0 To arr.Count - 1
Dim gpSt as IGPSubtype = CType(arr.Element(i), IGPSubtype)
dictSubtypes.Add(gpSt.SubtypeCode, gpSt.SubtypeName)
Next
The C++ syntax for IEnumSubtype.Next shows that SubtypeCode is an out parameter. You can loop through IEnumSubtype getting both the subtype codes and descriptions for your featureclass. Loop while the returned string is not null.
byref
, which means that you would provide a variable that gets set by the method. I think it would have made it clearer if Esri made itout
instead ofbyref
.