Tonight I came across the MgSelection.GenerateFilter bug. I had read about it, and made a mental note that one day it would be an issue. That note wasn’t very good, and I completely forgot about it. I was wrapping up the RADE updates around the report this eve and fortunately I bothered to select the entire map and run through a report.
Report looked good. The results were sorting, checkboxes working. Wait a minute, I selected the entire map. There should be more than twenty items returned. So a quick search of my twelve thousand saved e-mails from the Mapguide Users mailing list turned up what needed to be done. Fortunately Autodesk added a GenerateFilters call to MgSelection. This call returns an MgStringCollection of filters.
Basically the solution to this problem is to use GenerateFilters instead of GenerateFilter, and loop through the results. Each time, appending the returned keys to the complete list. For example:
1: Public Shared Function GetSelectedKeysString(ByRef siteConn As MgSiteConnection, _
2: ByRef resSvc As MgResourceService, ByVal oMap As MgMap, ByVal SessionId As String, _
3: ByVal SelectionXML As String, ByVal layerResID As MgResourceIdentifier, _
4: ByVal keyFieldName As String) As String
5:
6: Dim szKeys As String = ""
7: Dim oSel As New MgSelection(oMap)
8: oSel.FromXml(SelectionXML)
9: Dim curLay As MgLayerBase
10: 'isolate the layer
11: For Each layerItem As MgLayerBase In oSel.GetLayers
12: If layerItem.Name = layerResID.Name Then
13: curLay = layerItem
14: End If
15: Next
16:
17: Dim featSvc As MgFeatureService = siteConn.CreateService(MgServiceType.FeatureService)
18: Dim queryOptions As New MgFeatureQueryOptions
19: Dim featureClassName As String = curLay.GetFeatureClassName
20: 'workaround using GenerateFilters and looping through the results as needed
21: Dim featureReader As MgFeatureReader
22: Dim filters As MgStringCollection = oSel.GenerateFilters(curLay, featureClassName, 20)
23: Dim filterCnt As Integer = 0
24: While filterCnt < filters.GetCount
25: queryOptions.SetFilter(filters.GetItem(filterCnt))
26: featureReader = featSvc.SelectFeatures(New MgResourceIdentifier(curLay.GetFeatureSourceId), featureClassName, queryOptions)
27: While featureReader.ReadNext
28: If szKeys = "" Then
29: szKeys = ConvertPropertyToString(featureReader, keyFieldName)
30: Else
31: szKeys &= "," & ConvertPropertyToString(featureReader, keyFieldName)
32: End If
33: End While
34: featureReader.Close()
35: featureReader.Dispose()
36: filterCnt += 1
37: End While
38: Return szKeys
39: End Function
In this code, we get the selection from the MgMap object and then isolate the layer in question. Then we generate the collection of filters and loop through them. Each time, adding the appropriate value to the list of keys. Note the use of ConverPropertyToString, this needs to be used to ensure that the various data types are converted over to string.
I’ve included this function as well as a couple other handy related ones in the attached zip file
. If you’re looking for a C# example of how to use GenerateFilters one is provided in the source for buffers.aspx.
After making these changes my reports now look all proper! hurray. Maybe I can hit the sack now? nahh.
