近来做关于打开图层属性表时有个小发现,就是在遍历图层中的要素时要用的Search方法,但是IFeatureClass和IFeatureLayer中都有这个方法,到底用哪个呢?测试了下,如果用IFeatureClass中的Search方法,那么打开的是原始图层中所有元素的属性,那么即使我对一个图层进行了编辑,比如删除了这个图层中的某些要素,但是打开属性表时里面的数据内容还是原始图层的内容。因此,要想对更新后的图层进行属性表的浏览,就要用到IFeatureLayer.Search方法了。
现在贴出打开属性表的代码,以便更直观的展示给大家。
Public Sub LoadDatatoView(ByVal pFeatureLayer As ILayer, ByVal dtGridView As DataGridView)
Dim aa As IFeatureLayer = CType(pFeatureLayer, IFeatureLayer)
Dim pFields As IFields = aa.FeatureClass.Fields
Dim pDataTable As New DataTable
Dim i As Int32
For i = 0 To pFields.FieldCount - 1
Dim fldName As String
fldName = pFields.Field(i).AliasName
pDataTable.Columns.Add(fldName)
Next
Dim pFeatureCursor As IFeatureCursor
Dim pQueryFilter As IQueryFilter '查询过滤器
pQueryFilter = New QueryFilter '创建一个新的查询过滤器
pQueryFilter.WhereClause = ""
pFeatureCursor = aa.Search(pQueryFilter, False)
Dim pFeature As IFeature
pFeature = pFeatureCursor.NextFeature()
While (Not pFeature Is Nothing)
Dim j As Int32
Dim fldValue As String
Dim dr As DataRow = pDataTable.NewRow()
For j = 0 To pFields.FieldCount - 1
Dim fldName As String
fldName = pFields.Field(j).AliasName
If fldName = "Shape" Then
If pFeature.Shape.GeometryType = 1 Then
fldValue = "point"
ElseIf pFeature.Shape.GeometryType = 3 Then
fldValue = "polyline"
ElseIf pFeature.Shape.GeometryType = 4 Then
fldValue = "polygon"
Else
fldValue = "unknown type"
End If
Else
fldValue = pFeature.Value(j).ToString()
End If
dr(j) = fldValue
Next
pDataTable.Rows.Add(dr)
pFeature = pFeatureCursor.NextFeature()
End While
dtGridView.DataSource = pDataTable
End Sub
其中的pfeatureCursor = aa.Search(pQueryFilter, False),这句话aa是IFeatureLayer,而不是IFeatureClass.
现在贴出打开属性表的代码,以便更直观的展示给大家。
Public Sub LoadDatatoView(ByVal pFeatureLayer As ILayer, ByVal dtGridView As DataGridView)
Dim aa As IFeatureLayer = CType(pFeatureLayer, IFeatureLayer)
Dim pFields As IFields = aa.FeatureClass.Fields
Dim pDataTable As New DataTable
Dim i As Int32
For i = 0 To pFields.FieldCount - 1
Dim fldName As String
fldName = pFields.Field(i).AliasName
pDataTable.Columns.Add(fldName)
Next
Dim pFeatureCursor As IFeatureCursor
Dim pQueryFilter As IQueryFilter '查询过滤器
pQueryFilter = New QueryFilter '创建一个新的查询过滤器
pQueryFilter.WhereClause = ""
pFeatureCursor = aa.Search(pQueryFilter, False)
Dim pFeature As IFeature
pFeature = pFeatureCursor.NextFeature()
While (Not pFeature Is Nothing)
Dim j As Int32
Dim fldValue As String
Dim dr As DataRow = pDataTable.NewRow()
For j = 0 To pFields.FieldCount - 1
Dim fldName As String
fldName = pFields.Field(j).AliasName
If fldName = "Shape" Then
If pFeature.Shape.GeometryType = 1 Then
fldValue = "point"
ElseIf pFeature.Shape.GeometryType = 3 Then
fldValue = "polyline"
ElseIf pFeature.Shape.GeometryType = 4 Then
fldValue = "polygon"
Else
fldValue = "unknown type"
End If
Else
fldValue = pFeature.Value(j).ToString()
End If
dr(j) = fldValue
Next
pDataTable.Rows.Add(dr)
pFeature = pFeatureCursor.NextFeature()
End While
dtGridView.DataSource = pDataTable
End Sub
其中的pfeatureCursor = aa.Search(pQueryFilter, False),这句话aa是IFeatureLayer,而不是IFeatureClass.