ArcObjects虽然支持使用SQL语句来对数据进行查询,但是这种支持的程度很低。如果我们想依据某个属性来排列查找出来的数据,在普通关系数据库中仅仅是在Select语句后面加上“Order by ***”,但是AO对这个操作不能直接支持。
AO的帮助中说会它们在下个版本中提供这个基本的功能。在它们还不能支持前,我们可以使用TableSort对象来完成这个任务。TableSort对象是表的排序对象,它可以将查找的结果按照某个字段进行排序,然后返回所有符合条件的要素的游标。
ITableSort接口可以让我们设置TableSort对象的属性并且执行排序。对一个TableSort而言,Table和Fields属性是必须被设置的,其它的属性都是可以选择的。除了使用表外,选择集可以作为一个需要排序的数据源。
Fields是一个用于排序的字段列表,它可以有多个字段输入,当使用ITableSort::Sort方法排序的时候,它会首先根据第一个字段进行排序,然后根据第二个进行排序,依此类推。
我们也可以使用Cursor属性用于排序,当我们设置Cursor时,必须使用Table属性来设置这个cursor指向的表对象。
除此以外,我们还可以设置Ascending、CaseSensitive属性等,前者用于确定使用那个字段升序排列,后者确定使用使用大小写敏感设置。
下面的代码段是一个排序的例子:
Public Sub FeatSort()
Dim pFact As IWorkspaceFactory
pFact = New ShapefileWorkspaceFactory
Dim pWorkspace As IFeatureWorkspace
pWorkspace = pFact.OpenFromFile("E:\arcgisdata\ESRIDATA\USA\", 0)
Dim pFeatClass As IFeatureClass
pFeatClass = pWorkspace.OpenFeatureClass("states")
'产生一个临时的工作空间
Dim pScratchWorkspace As IWorkspace
Dim pScratchWorkspaceFactory As IScratchWorkspaceFactory
pScratchWorkspaceFactory = New ScratchWorkspaceFactory
pScratchWorkspace = pScratchWorkspaceFactory.DefaultScratchWorkspace
'新建一个过滤器
Dim pQFilt As IQueryFilter
pQFilt = New QueryFilter
pQFilt.WhereClause = "Area > 77000"
'获得选择集
Dim pSelectionSet As ISelectionSet
pSelectionSet = pFeatClass.Select(Nothing, esriSelectionType.esriSelectionTypeIDSet, esriSelectionOption.esriSelectionOptionNormal, pScratchWorkspace)
'新建一个TableSort对象
Dim pTableSort As ITableSort
pTableSort = New TableSort
With pTableSort
'进行排序的字段
.Fields = "Area,state_name"
'Area字段不是升序排列
.Ascending ("Area") = False
.Ascending ("State_name") = True
'设置排列的数据源
.SelectionSet = pSelectionSet
End With
pTableSort.Sort (Nothing)
Dim pCursor As IFeatureCursor
pCursor = pTableSort.Rows
Dim pFeat As IFeature
pFeat = pCursor.NextFeature
Dim i As Integer
Do While Not pFeat Is Nothing
MessageBox.Show(pFeat.Value(3) & ":" & pFeat.Value(2))
pFeat = pCursor.NextFeature
Loop
End Sub
上面的例子是使用一个从要素类中提取出来的要素选择集作为数据源,对这个要素选择集进行排序的操作。其中要素的第3个字段为“State_Name”,第二个字段为“Area”。
另外读者还注意一下IFeatureClass::Select方法和IFeatureSelection::Select方法的区别。

相关评论
