Common_AddGraphics_VBNet\App_Code\GraphicPointTools.vb
' Copyright 2010 ESRI ' ' All rights reserved under the copyright laws of the United States ' and applicable international laws, treaties, and conventions. ' ' You may freely redistribute and use this sample code, with or ' without modification, provided you include the original copyright ' notice and use restrictions. ' ' See the use restrictions. ' Imports Microsoft.VisualBasic Imports System Namespace AddPoint Public Class ElementGraphicTool Implements ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServerToolAction #Region "IMapServerToolAction Members" Private Sub ServerAction(ByVal toolEventArgs As ESRI.ArcGIS.ADF.Web.UI.WebControls.ToolEventArgs) Implements ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServerToolAction.ServerAction ' Get a reference to the map control by casting the event aarguments object to a Map Dim adfMap As ESRI.ArcGIS.ADF.Web.UI.WebControls.Map = CType(toolEventArgs.Control, ESRI.ArcGIS.ADF.Web.UI.WebControls.Map) Try ' Get a reference to the point clicked on the map as a Web ADF point object by ' (1) casting the event arguments to a MapPointEventArgs object and (2) accessing ' the MapPoint property on MapPointEventArgs Dim mapPointEventArgs As ESRI.ArcGIS.ADF.Web.UI.WebControls.MapPointEventArgs = CType(toolEventArgs, ESRI.ArcGIS.ADF.Web.UI.WebControls.MapPointEventArgs) Dim adfPoint As ESRI.ArcGIS.ADF.Web.Geometry.Point = mapPointEventArgs.MapPoint ' Retrieve the map functionality for the graphics resource Dim graphicsMapFunctionality As ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality = TryCast(adfMap.GetFunctionality("ADFGraphicsResource"), ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality) ' Make sure the graphics resource was found If graphicsMapFunctionality Is Nothing Then ' If the graphics resource was not found, use the ProcessError utility function ' to notify the user. This function creates a Web ADF callback result that ' specifies displaying a JavaScript alert with the passed-in text. We copy ' this callback result to the Map Control's callback results collection, because ' Web ADF Tools and Commands (and the classes that inherit from them) process ' callback results from the map after execution. adfMap.CallbackResults.CopyFrom (Utility.CreateErrorCallback("ADF graphics functionality not found")) Return End If ' Attempt to retrieve the element graphics layer that will hold the graphic point Dim elementGraphicsLayer As ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer = Nothing If graphicsMapFunctionality.GraphicsDataSet.Tables.Contains("Element Graphics") Then elementGraphicsLayer = TryCast(graphicsMapFunctionality.GraphicsDataSet.Tables("Element Graphics"), ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer) End If ' Check whether the element graphics layer was found. If not, create it. If elementGraphicsLayer Is Nothing Then ' Create a new instance of ElementGraphicsLayer and assign it to our ' ElementGraphicsLayer object variable. elementGraphicsLayer = New ESRI.ArcGIS.ADF.Web.Display.Graphics.ElementGraphicsLayer() ' Name the layer via the inherited System.Data.DataTable.TableName property elementGraphicsLayer.TableName = "Element Graphics" ' Add the layer to the graphics resource's tables collection. Note that the ' resource's GraphicsDataSet property inherits from System.Data.DataSet, so we ' add the table the same way as we would if this were a "regular" DataSet object graphicsMapFunctionality.GraphicsDataSet.Tables.Add(elementGraphicsLayer) ' Get a reference to the Toc control on the same page as the map. Note this code ' assumes that a Toc control named "Toc1" exists and will throw an exception if ' one does not. Dim adfToc As ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc = CType(Utility.FindControl("Toc1", adfMap.Page), ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc) ' Refreshing the Toc control will add the new graphics layer to the Toc via ' the MapResourceManager --> Map --> Toc buddy relationship adfToc.Refresh() ' Copy the callback results from the Toc (which has callback results because of the ' above call to Refresh) to the Map because Web ADF Tools and Commands only process ' the callback results of the Map. adfMap.CallbackResults.CopyFrom(adfToc.CallbackResults) End If ' Uncomment to make the tool remove the previous point when adding a new one 'elementGraphicsLayer.Clear(); ' Initialize a simple marker symbol that will be used specify the default symbology ' of the graphics in the element graphics layer Dim defaultSimpleMarkerSymbol As ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol = New ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol() defaultSimpleMarkerSymbol.Color = System.Drawing.Color.Black defaultSimpleMarkerSymbol.Width = 20 defaultSimpleMarkerSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Triangle ' Initialize a simple marker symbol that will be used to specify the appearance of ' selected graphics in the element graphics layer Dim selectedSimpleMarkerSymbol As ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol = New ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol() selectedSimpleMarkerSymbol.Color = System.Drawing.Color.Yellow selectedSimpleMarkerSymbol.Width = 12 ' Create a graphic element located at the point clicked on the map, and with the symbology ' specified by the renderers initialized above Dim graphicElement As ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement = New ESRI.ArcGIS.ADF.Web.Display.Graphics.GraphicElement(adfPoint, defaultSimpleMarkerSymbol, selectedSimpleMarkerSymbol) ' Add the element to the graphics layer elementGraphicsLayer.Add(graphicElement) ' Refresh the graphics resource so the new graphics element is displayed adfMap.RefreshResource(graphicsMapFunctionality.Resource.Name) Catch exception As System.Exception Dim errorCallbackResult As ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult = Utility.GetErrorCallback(exception) adfMap.CallbackResults.Add(errorCallbackResult) End Try End Sub #End Region End Class Public Class FeatureGraphicTool Implements ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServerToolAction #Region "IMapServerToolAction Members" Private Sub ServerAction(ByVal toolEventArgs As ESRI.ArcGIS.ADF.Web.UI.WebControls.ToolEventArgs) Implements ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServerToolAction.ServerAction ' Get a reference to the map control by casting the event aarguments object to a Map Dim adfMap As ESRI.ArcGIS.ADF.Web.UI.WebControls.Map = CType(toolEventArgs.Control, ESRI.ArcGIS.ADF.Web.UI.WebControls.Map) Try ' Get a reference to the point clicked on the map as a Web ADF point object by ' (1) casting the event arguments to a MapPointEventArgs object and (2) accessing ' the MapPoint property on MapPointEventArgs Dim mapPointEventArgs As ESRI.ArcGIS.ADF.Web.UI.WebControls.MapPointEventArgs = CType(toolEventArgs, ESRI.ArcGIS.ADF.Web.UI.WebControls.MapPointEventArgs) Dim adfPoint As ESRI.ArcGIS.ADF.Web.Geometry.Point = mapPointEventArgs.MapPoint ' Retrieve the map functionality for the graphics resource Dim graphicsMapFunctionality As ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality = TryCast(adfMap.GetFunctionality("ADFGraphicsResource"), ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality) ' Make sure the graphics resource was found If graphicsMapFunctionality Is Nothing Then ' If the graphics resource was not found, use the ProcessError utility function ' to notify the user. This function creates a Web ADF callback result that ' specifies displaying a JavaScript alert with the passed-in text. We copy ' this callback result to the Map Control's callback results collection, because ' Web ADF Tools and Commands (and the classes that inherit from them) process ' callback results from the map after execution. adfMap.CallbackResults.CopyFrom (Utility.CreateErrorCallback("ADF graphics functionality not found")) Return End If ' Attempt to retrieve the feature graphics layer that will hold the feature point Dim featureGraphicsLayer As ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer = Nothing If graphicsMapFunctionality.GraphicsDataSet.Tables.Contains("Feature Graphics") Then featureGraphicsLayer = TryCast(graphicsMapFunctionality.GraphicsDataSet.Tables("Feature Graphics"), ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer) End If ' Check whether the feature graphics layer was found. If not, create it. If featureGraphicsLayer Is Nothing Then ' Create a new instance of ElementGraphicsLayer and assign it to our ' ElementGraphicsLayer object variable. featureGraphicsLayer = New ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer() ' Name the layer via the inherited System.Data.DataTable.TableName property featureGraphicsLayer.TableName = "Feature Graphics" ' Add the layer to the graphics resource's tables collection. Note that the ' resource's GraphicsDataSet property inherits from System.Data.DataSet, so we ' add the table the same way as we would if this were a "regular" DataSet object graphicsMapFunctionality.GraphicsDataSet.Tables.Add(featureGraphicsLayer) ' Configure and add columns to the feature graphics layer. Since the ' FeatureGraphicsLayer type inherits from System.Data.DataTable, we instantiate ' and initialize the columns in the same way as System.Data.DataColumns, and ' add them to the FeatureGraphicsLayer in the same way as we would with a ' DataTable. ' Create an X column Dim xDataColumn As System.Data.DataColumn = New System.Data.DataColumn("X", System.Type.GetType("System.Double")) featureGraphicsLayer.Columns.Add(xDataColumn) ' Create a Y column Dim yDataColumn As System.Data.DataColumn = New System.Data.DataColumn("Y", System.Type.GetType("System.Double")) featureGraphicsLayer.Columns.Add(yDataColumn) ' Create a "CustomDataColumn" column Dim customDataColumn As System.Data.DataColumn = New System.Data.DataColumn("CustomDataColumn", System.Type.GetType("System.Int32")) featureGraphicsLayer.Columns.Add(customDataColumn) ' Define the symbology for the feature graphics layer. In this case, we ' demonstrate creation of unique value symbology - a different symbol for ' different values of a given field. To do this, we need to not only define ' marker symbols (we use SimpleMarkerSymbols here), but we also need to ' define objects that specify which symbol to use for which values. To ' associate particular symbols with particular values, we use the Web ADF ' UniqueValue object. Then to associate symbol-value pairings with a ' feature graphics layer, including which field to take values from for ' symbolization, we use a Web ADF ValueMapRenderer object. ' Instantiate a UniqueValue object and initialize it to be associated with ' an integer value of 0. This is done by specifying int as the type in the ' angle brackets, and 0 as the parameter to the constructor Dim zeroUniqueValue As ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue(Of Integer) = New ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue(Of Integer)(0) ' Create and initialize a SimpleMarkerSymbol to specify the appearance of ' graphics with a value of 0 Dim zeroSymbol As ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol = New ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol() zeroSymbol.Color = System.Drawing.Color.Red zeroSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Circle zeroSymbol.Width = 12 ' Associate the SimpleMarkerSymbol initialized above with the UniqueValue object zeroUniqueValue.Symbol = zeroSymbol ' The SymbolLabel will be shown in the table of contents zeroUniqueValue.SymbolLabel = "0" ' Instantiate another UniqueValue object, this time initializing it to be ' associated with an integer value of 1. Dim oneUniqueValue As ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue(Of Integer) = New ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue(Of Integer)(1) ' Create and initialize a SimpleMarkerSymbol to specify the appearance of ' graphics with a value of 1 Dim oneSymbol As ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol = New ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol() oneSymbol.Color = System.Drawing.Color.Blue oneSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Circle oneSymbol.Width = 12 ' Associate this new SimpleMarkerSymbol with the UniqueValue object associated ' with an integer value of 1 oneUniqueValue.Symbol = oneSymbol ' The SymbolLabel will be shown in the table of contents oneUniqueValue.SymbolLabel = "1" ' Create and initialize a SimpleMarkerSymbol to specify default symbology for the ' feature graphics layer - this will be used in the event the value being used for ' symbolization was not specified by a value-symbol pairing Dim defaultSimpleMarkerSymbol As ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol = New ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol() defaultSimpleMarkerSymbol.Color = System.Drawing.Color.DarkGoldenrod defaultSimpleMarkerSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Cross defaultSimpleMarkerSymbol.Width = 12 ' Instantiate a ValueMapRenderer to use in associating the symbol-value pairings ' with a feature graphics layer and specifying which column to symbolize Dim valueMapRenderer As ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer(Of Integer) = New ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer(Of Integer)() ' Specify which column to draw values from for symbolization valueMapRenderer.ValueColumnName = "CustomDataColumn" ' Initialize the default label and symbol. This will be used if the value ' being symbolized does not have an explicit symbology specification. valueMapRenderer.DefaultLabel = "Default Value" valueMapRenderer.DefaultSymbol = defaultSimpleMarkerSymbol ' Get a reference to the collection of values with explicit symbol-value pairings ' in the ValueMapRenderer Dim valueCollection As ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueCollection(Of Integer) = valueMapRenderer.Values ' Add the symbol-value pairings specified above and encapsulated in UniqueValue ' objects to the ValueMapRenderer valueCollection.Add(zeroUniqueValue) valueCollection.Add(oneUniqueValue) ' Associate the default and selected symbology of the feature graphics layer ' with the symbol-value definitions contained in the ValueMapRenderer featureGraphicsLayer.Renderer = valueMapRenderer featureGraphicsLayer.SelectedRenderer = valueMapRenderer ' Get a reference to the Toc control on the same page as the map. Note this code ' assumes the existence of a Toc control named "Toc1" and will throw an exception if ' there is no such control. Dim adfToc As ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc = CType(Utility.FindControl("Toc1", adfMap.Page), ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc) ' Refreshing the Toc control will add the new graphics layer to the Toc via ' the MapResourceManager --> Map --> Toc buddy relationship adfToc.Refresh() ' Copy the callback results from the Toc (which has callback results because of the ' above call to Refresh) to the Map because Web ADF Tools and Commands only process ' the callback results of the Map. adfMap.CallbackResults.CopyFrom(adfToc.CallbackResults) ' Create a callback result containing the JavaScript needed to enable the "Enable ' Map Tips on Feature Points" checkbox. The checkbox can now be enabled because ' the code triggered by checking the checkbox assumes the existence of the feature ' graphics layer that was just created. Dim jsEnableCheckbox As String = String.Format("document.getElementById('{0}').disabled = false", "maptipsCheckBox") Dim enableCheckboxCallbackResult As ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult = ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult.CreateJavaScript(jsEnableCheckbox) ' Add the checkbox enabling callback result to the map so the JavaScript is executed adfMap.CallbackResults.Add(enableCheckboxCallbackResult) End If ' Add the clicked map point to the feature graphics layer and get a reference to ' the row created in the underlying DataTable Dim newDataRow As System.Data.DataRow = featureGraphicsLayer.Add(adfPoint) ' Populate the CustomDataColumn field with a random number between 0 and 2 (inclusive). ' We use these values to demonstrate the feature graphics layer's defined symbol-value ' pairings (for 0 and 1) as well as the default symbology (for 2) Dim randomizer As System.Random = New System.Random() ' Note the parameters passed to Next are actually 0 and 3 because the lower bound is ' inclusive, but the upper bound is exclusive. Dim randomValue As Integer = randomizer.Next(0, 3) newDataRow("CustomDataColumn") = randomValue ' Populate the X and Y fields with the location of the clicked map point. The first format ' parameter specifies to only include two decimal places. newDataRow("X") = String.Format("{0:#.##}", adfPoint.X) newDataRow("Y") = String.Format("{0:#.##}", adfPoint.Y) ' Set the new feature graphic to be selected by setting the field storing the corresponding ' boolean to true Dim selectedColumn As System.Data.DataColumn = featureGraphicsLayer.IsSelectedColumn newDataRow(selectedColumn) = True ' Refresh the graphics resource so the new feature graphic is displayed on the map adfMap.RefreshResource(graphicsMapFunctionality.Resource.Name) Catch exception As System.Exception Dim errorCallbackResult As ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult = Utility.GetErrorCallback(exception) adfMap.CallbackResults.Add(errorCallbackResult) End Try End Sub #End Region End Class Public Class FeatureDropDownColor Implements ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServerDropDownBoxAction #Region "IServerAction Members" Private Sub ServerAction(ByVal toolbarItemInfo As ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.ToolbarItemInfo) Implements ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IServerAction.ServerAction ' Get a reference to the Map control via the BuddyControls array of the passed-in ' ToolbarItemInfo. Note this code assumes the desired map is at the first index ' of the array. Dim adfMap As ESRI.ArcGIS.ADF.Web.UI.WebControls.Map = CType(toolbarItemInfo.BuddyControls(0), ESRI.ArcGIS.ADF.Web.UI.WebControls.Map) Try ' Get a reference to the color selection Web ADF drop down box Dim adfDropDownBox As ESRI.ArcGIS.ADF.Web.UI.WebControls.DropDownBox = CType(toolbarItemInfo.Toolbar.ToolbarItems.Find(toolbarItemInfo.Name), ESRI.ArcGIS.ADF.Web.UI.WebControls.DropDownBox) ' Retrieve the selected color from the drop down box Dim selectedColor As String = adfDropDownBox.SelectedValue ' Retrieve the map functionality for the graphics resource Dim graphicsMapFunctionality As ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality = TryCast(adfMap.GetFunctionality("ADFGraphicsResource"), ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality) ' Make sure the graphics resource was found If graphicsMapFunctionality Is Nothing Then ' If the graphics resource was not found, use the ProcessError utility function ' to notify the user. This function creates a Web ADF callback result that ' specifies displaying a JavaScript alert with the passed-in text. We copy ' this callback result to the Map Control's callback results collection, because ' Web ADF Tools and Commands (and the classes that inherit from them) process ' callback results from the map after execution. adfMap.CallbackResults.CopyFrom (Utility.CreateErrorCallback("ADF graphics functionality not found")) Return End If ' Attempt to retrieve the feature graphics layer for which symbology will be modified Dim featureGraphicsLayer As ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer = Nothing If graphicsMapFunctionality.GraphicsDataSet.Tables.Contains("Feature Graphics") Then featureGraphicsLayer = TryCast(graphicsMapFunctionality.GraphicsDataSet.Tables("Feature Graphics"), ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer) End If ' Make sure the feature graphics layer was found If featureGraphicsLayer Is Nothing Then ' Initialize a string containing the JavaScript necessary to reset the drop down box's ' value to "Red_Blue" Dim jsResetDropDownList As String = String.Format("document.getElementById('{0}{1}{2}').value = 'Red_Blue'", toolbarItemInfo.Toolbar.ClientID, adfDropDownBox.Name, adfDropDownBox.Type) ' Create a new ADF callback result containing the JavaScript Dim resetDropDownListCallbackResult As ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult = ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult.CreateJavaScript(jsResetDropDownList) ' Add the JavaScript callback result to the map so it is executed adfMap.CallbackResults.Add(resetDropDownListCallbackResult) ' Use the ProcessError utility method to add a callback to the map that will inform ' the user of the error adfMap.CallbackResults.CopyFrom (Utility.CreateErrorCallback("ADF feature graphics layer not found")) Return End If ' Get the ValueMapRenderer and ValueCollection from the feature graphics layer. This is where ' the symbol-value pairings are specified Dim currentValueMapRenderer As ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer(Of Integer) = CType(featureGraphicsLayer.Renderer, ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer(Of Integer)) Dim currentValueCollection As ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueCollection(Of Integer) = currentValueMapRenderer.Values ' Get the symbol-value pairings for values 0 and 1 from the ValueCollection. Each pairing ' is encapsulated in a UniqueValue object. Dim currentZeroUniqueValue As ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue(Of Integer) = CType(currentValueCollection(0), ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue(Of Integer)) Dim currentOneUniqueValue As ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue(Of Integer) = CType(currentValueCollection(1), ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue(Of Integer)) ' Get the symbol for each of the pairings Dim currentZeroSymbol As ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol = CType(currentZeroUniqueValue.Symbol, ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol) Dim currentOneSymbol As ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol = CType(currentOneUniqueValue.Symbol, ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol) ' Check which color combination was selected from the drop down box and reassign the colors ' on the SimpleMarkerSymbols accordingly Select Case selectedColor Case "Red_Blue" currentZeroSymbol.Color = System.Drawing.Color.Red currentOneSymbol.Color = System.Drawing.Color.Blue Case "Yellow_Green" currentZeroSymbol.Color = System.Drawing.Color.Yellow currentOneSymbol.Color = System.Drawing.Color.Green Case "Orange_Purple" currentZeroSymbol.Color = System.Drawing.Color.Orange currentOneSymbol.Color = System.Drawing.Color.Purple Case Else End Select ' Get a reference to the Toc control on the same page as the map. Note this code ' assumes the existence of a Toc control named "Toc1" and will throw an exception if ' there is no such control. Dim adfToc As ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc = CType(Utility.FindControl("Toc1", adfMap.Page), ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc) ' Refreshing the Toc control will add the new graphics layer to the Toc via ' the MapResourceManager --> Map --> Toc buddy relationship adfToc.Refresh() ' The Toc has callback results because of (a) the change in feature graphic symbology, ' and (b) the above call to Refresh. To update the Toc to reflect the new symbology of ' the feature graphics layer, we must copy these callback results to the Map because ' Web ADF DropDownBoxes only process the callback results of the Map. adfMap.CallbackResults.CopyFrom(adfToc.CallbackResults) ' Refresh the graphics resource so the feature graphic modifications are displayed adfMap.RefreshResource(graphicsMapFunctionality.Resource.Name) Catch exception As System.Exception Dim errorCallbackResult As ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult = Utility.GetErrorCallback(exception) adfMap.CallbackResults.Add(errorCallbackResult) End Try End Sub #End Region End Class Public Class FeatureDropDownSymbol Implements ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IMapServerDropDownBoxAction #Region "IServerAction Members" Private Sub ServerAction(ByVal toolbarItemInfo As ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.ToolbarItemInfo) Implements ESRI.ArcGIS.ADF.Web.UI.WebControls.Tools.IServerAction.ServerAction ' Get a reference to the Map control via the BuddyControls array of the passed-in ' ToolbarItemInfo. Note this code assumes the desired map is at the first index ' of the array. Dim adfMap As ESRI.ArcGIS.ADF.Web.UI.WebControls.Map = CType(toolbarItemInfo.BuddyControls(0), ESRI.ArcGIS.ADF.Web.UI.WebControls.Map) Try ' Get a reference to the color selection Web ADF drop down box Dim adfDropDownBox As ESRI.ArcGIS.ADF.Web.UI.WebControls.DropDownBox = CType(toolbarItemInfo.Toolbar.ToolbarItems.Find(toolbarItemInfo.Name), ESRI.ArcGIS.ADF.Web.UI.WebControls.DropDownBox) ' Retrieve the selected shape from the drop down box Dim selectedShape As String = adfDropDownBox.SelectedValue ' Retrieve the map functionality for the graphics resource Dim graphicsMapFunctionality As ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality = TryCast(adfMap.GetFunctionality("ADFGraphicsResource"), ESRI.ArcGIS.ADF.Web.DataSources.Graphics.MapFunctionality) ' Make sure the graphics resource was found If graphicsMapFunctionality Is Nothing Then ' If the graphics resource was not found, use the ProcessError utility function ' to notify the user. This function creates a Web ADF callback result that ' specifies displaying a JavaScript alert with the passed-in text. We copy ' this callback result to the Map Control's callback results collection, because ' Web ADF Tools and Commands (and the classes that inherit from them) process ' callback results from the map after execution. adfMap.CallbackResults.CopyFrom (Utility.CreateErrorCallback("ADF graphics functionality not found")) Return End If ' Attempt to retrieve the feature graphics layer that will hold the feature point Dim featureGraphicsLayer As ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer = Nothing If graphicsMapFunctionality.GraphicsDataSet.Tables.Contains("Feature Graphics") Then featureGraphicsLayer = TryCast(graphicsMapFunctionality.GraphicsDataSet.Tables("Feature Graphics"), ESRI.ArcGIS.ADF.Web.Display.Graphics.FeatureGraphicsLayer) End If ' Make sure the feature graphics layer was found If featureGraphicsLayer Is Nothing Then ' Initialize a string containing the JavaScript necessary to reset the drop down box's ' value to "Red_Blue" Dim jsResetDropDownList As String = String.Format("document.getElementById('{0}{1}{2}').value = 'Circle'", toolbarItemInfo.Toolbar.ClientID, adfDropDownBox.Name, adfDropDownBox.Type) ' Create a new ADF callback result containing the JavaScript Dim resetDropDownListCallbackResult As ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult = ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult.CreateJavaScript(jsResetDropDownList) ' Add the JavaScript callback result to the map so it is executed adfMap.CallbackResults.Add(resetDropDownListCallbackResult) ' Use the ProcessError utility method to add a callback to the map that will inform ' the user of the error adfMap.CallbackResults.CopyFrom (Utility.CreateErrorCallback("ADF feature graphics layer not found")) Return End If ' Get the ValueMapRenderer and ValueCollection from the feature graphics layer. This is where ' the symbol-value pairings are specified Dim currentValueMapRenderer As ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer(Of Integer) = CType(featureGraphicsLayer.Renderer, ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueMapRenderer(Of Integer)) Dim currentValueCollection As ESRI.ArcGIS.ADF.Web.Display.Renderer.ValueCollection(Of Integer) = currentValueMapRenderer.Values ' Get the symbol-value pairings for values 0 and 1 from the ValueCollection. Each pairing ' is encapsulated in a UniqueValue object. Dim currentZeroUniqueValue As ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue(Of Integer) = CType(currentValueCollection(0), ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue(Of Integer)) Dim currentOneUniqueValue As ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue(Of Integer) = CType(currentValueCollection(1), ESRI.ArcGIS.ADF.Web.Display.Renderer.UniqueValue(Of Integer)) ' Get the symbol for each of the pairings Dim currentZeroSymbol As ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol = CType(currentZeroUniqueValue.Symbol, ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol) Dim currentOneSymbol As ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol = CType(currentOneUniqueValue.Symbol, ESRI.ArcGIS.ADF.Web.Display.Symbol.SimpleMarkerSymbol) ' Check which shape was selected from the drop down box and reassign the shapes of the ' SimpleMarkerSymbols accordingly Select Case selectedShape Case "Circle" currentZeroSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Circle currentOneSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Circle Case "Star" currentZeroSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Star currentOneSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Star Case "Square" currentZeroSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Square currentOneSymbol.Type = ESRI.ArcGIS.ADF.Web.Display.Symbol.MarkerSymbolType.Square Case Else End Select ' Get a reference to the Toc control on the same page as the map. Note this code ' assumes the existence of a Toc control named "Toc1" and will throw an exception if ' there is no such control. Dim adfToc As ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc = CType(Utility.FindControl("Toc1", adfMap.Page), ESRI.ArcGIS.ADF.Web.UI.WebControls.Toc) ' Refreshing the Toc control will add the new graphics layer to the Toc via ' the MapResourceManager --> Map --> Toc buddy relationship adfToc.Refresh() ' The Toc has callback results because of (a) the change in feature graphic symbology, ' and (b) the above call to Refresh. To update the Toc to reflect the new symbology of ' the feature graphics layer, we must copy these callback results to the Map because ' Web ADF DropDownBoxes only process the callback results of the Map. adfMap.CallbackResults.CopyFrom(adfToc.CallbackResults) ' Refresh the graphics resource so the feature graphic modifications are displayed adfMap.RefreshResource(graphicsMapFunctionality.Resource.Name) Catch exception As System.Exception Dim errorCallbackResult As ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult = Utility.GetErrorCallback(exception) adfMap.CallbackResults.Add(errorCallbackResult) End Try End Sub #End Region End Class End Namespace