Visual Basic (Declaration) | |
---|---|
Public Event InitializationFailed As EventHandler(Of EventArgs) |
C# | |
---|---|
public event EventHandler<EventArgs> InitializationFailed |
There are several reasons why a Layer may have problems and cause the InitializationFailed Event to execute. Some of these reasons include: ArcGIS Server may be down, the internet connection for the application may be down, an incorrect URL for the layer might have been used, the wrong Layer Type (i.e. ArcGISDynamicMapServiceLayer, ArcGISTiledMapServiceLayer, FeatureLayer, etc.) may have been specified for the URL that would have ordinarily worked properly if the correct Layer Type was specified, etc.
The code execution pattern for Layers is: first the Layer.Initialized Event fires and then if there is a problem the Layer.InitializationFailed Event fires. If the Layer loads correctly, the InitializationFailed Event will not execute. See the following screen shot:
Because the Layer.Initialized Event always executes, it is a highly recommended coding practice to wrap any coding logic that will use Properties or Methods of the Layer within an If/Then statement that checks to make sure that the Layer.InitializationFailure Property is Nothing/null. See the code example in this document for a demonstration of this pattern.
If a Layer fails to initialize and the Layer.IntializationFailed Event stub code has not been generated in the code-behind, and Unhandled Exception will be thrown which will terminate your application. See the following screen shot:
Therefore, it is a best practice to always have the code-behind stubs for the Layer.IntializationFailed Event in place for every Layer in your application that loads in the Map. The Layer.IntializationFailed Event stubs are automatically generated in code-behind when the InitializedFailed attribute is specified in XAML. You can also dynamically add Layer.IntializationFailed Event stubs in the code-behind.
You can use a separate Layer.IntializationFailed Event for every Layer in your application or you can have multiple Layers use a single Layer.IntializationFailed Event. See the code example in this document for a demonstration of this pattern.
To access the System.Exception error that occurs when the Layer.InitializationFailed Event fires, use the Layer.InitializationFailure Property. Two very helpful Properties on the System.Exception are the .InnerException and .Message. Use the other System.Exception Properties as needed. In .NET there are numerous Exception Types and the System.Exception is the base. Some of the more common Exception Types that can be returned from the Layer.InitializationFailure Property include: System.NotSupportedException, System.Security.SecurityException, and System.Net.WebException.
How to use:
When the application loads a couple of error message dialogs will appear for Layers that have some kind of problem. Other Layers will load appropriately and a Map will be generated. Read the notes in the XAML and code-behind to experiment with altering the sample to see how error handling occurs in the Initialized and InitializationFailed Events.
The XAML code in this example is used in conjunction with the code-behind (C# or VB.NET) to demonstrate the functionality.
The following screen shot corresponds to the code example in this page.
XAML | Copy Code |
---|---|
<Grid x:Name="LayoutRoot"> <!-- Add a Map Control and zoom the the continental US. --> <esri:Map Background="White" HorizontalAlignment="Left" Margin="12,186,0,0" Name="Map1" WrapAround="True" VerticalAlignment="Top" Height="402" Width="594" Extent="-14188202,2354135,-7405065,6944744"> <esri:Map.Layers> <esri:LayerCollection> <!-- This ArcGISTiledMapServiceLayer will display in the Map without any errors. If you want to make an error occur and see what the InitializationFailed Event does, insert some bad text in the Url. --> <esri:ArcGISTiledMapServiceLayer ID="World_Light_Gray_Base" Url="http://server.arcgisonline.com/ArcGIS/rest/services/Canvas/World_Light_Gray_Base/MapServer" Initialized="ArcGISTiledMapServiceLayer_Initialized" InitializationFailed="ArcGISTiledMapServiceLayer_InitializationFailed"/> <!-- This ArcGISDynamicMapServiceLayer will display in the Map without any errors. If you want to make an error occur and see what the InitializationFailed Event does, insert some bad text in the Url. Note how you can have a seperate Initialized and InitializationFailed Events for every type of layer (ArcGISDynamicMapServiceLayer, ArcGISTiledServiceLayer, FeatureLayer, etc.) if you desire for complete control over your error handling. --> <esri:ArcGISDynamicMapServiceLayer ID="Population_Change" Url="http://server.arcgisonline.com/ArcGIS/rest/services/Demographics/USA_1990-2000_Population_Change/MapServer" Initialized="ArcGISDynamicMapServiceLayer_Initialized" InitializationFailed="ArcGISDynamicMapServiceLayer_InitializationFailed"/> <!-- This FeatureLayer will display in the Map without any errors. If you want to make an error occur and see what the InitializationFailed Event does, insert some bad text in the Url. Note this FeatureLayer shares the Initialized and InitializationFailed Events with the next FeatureLayer. You could have all layers in a project share one Initialized Event and one InitializationFalied Event and use a bunch of If/Then, Case/Switch, etc. type of logic to interrogate the Layer Types and take action accordingly. --> <esri:FeatureLayer ID="Earthquakes" Url="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Earthquakes/Since_1970/MapServer/0" Initialized="Generic_Layer_Initialized" InitializationFailed="Generic_Layer_InitializationFailed"/> <!-- This FeatureLayer will not display in the Map; it has errors. A MessageBox will appear when the application is loading telling you something is wrong with this service. You could add code in the InitializedFailed Event to handle things like re-loading the Map without the bad layer, switching to a different layer, etc. Note: this FeatureLayer shares the Initialized and InitializationFailed Events with the above FeatureLayer. --> <esri:FeatureLayer ID="BOGUS" Url="http://BOGUS.BOGUS.com/ArcGIS/rest/services/BOGUS/MapServer/0" Initialized="Generic_Layer_Initialized" InitializationFailed="Generic_Layer_InitializationFailed"/> <!-- This ArcGISTiledMapServiceLayer will not display in the Map; it has errors. A MessageBox will appear when the application is loading telling you something is wrong with this service. In this case no Cached Map Tiles were created when the web service was initially published (Remember that ArcGISDynamicMapServiceLayers and ArcGISTiledMapSericeLayers share the exact same URL syntax. It is when the Layer has Cached Map Tiles generated in the service as it is initially created that allows an ArcGISTiledMapServiceLayer to be used). You could change this to an ArcGISDynamicMapServiceLayer and it should work fine. Note: this ArcGISTiledMapServiceLayer shares the Initialized and InitializationFailed Events with the above other two FeatureLayers. --> <esri:ArcGISTiledMapServiceLayer ID="MyPoints_WithProblems" Url="http://sampleserver3.arcgisonline.com/ArcGIS/rest/services/Earthquakes/Since_1970/MapServer" Initialized="Generic_Layer_Initialized" InitializationFailed="Generic_Layer_InitializationFailed"/> <!-- This FeatureLayer (which is currently commented out) will not display in the Map; it has errors. As a matter of fact it will bring your application crashing down with an 'Unhandled Exception' in Visual Studio if you were to uncomment out the next line of XAML - try it to see what happens. This is because no InitializationFailed Event handler is wired up. The moral of the story is that in your production application, always use appropriate error handling using the InitializationFailed Event to catch for potential problems (never assume that a web service will always be running, it is the web after all). --> <!--<esri:FeatureLayer ID="BOGUS2" Url="http://BOGUS2.BOGUS2.com/ArcGIS/rest/services/BOGUS2/MapServer/0"/>--> </esri:LayerCollection> </esri:Map.Layers> </esri:Map> <!-- Provide the instructions on how to use the sample code. --> <TextBlock Height="142" HorizontalAlignment="Left" Name="TextBlock1" VerticalAlignment="Top" Width="606" TextWrapping="Wrap" Text="When the application loads a couple of error message dialogs will appear for Layers that have some kind of problem. Other Layers will load appropriately and a Map will be generated. Read the notes in the XAML and code-behind to experiment with altering the sample to see how error handling occurs in the Initialized and InitializationFailed Events." /> </Grid> |
C# | Copy Code |
---|---|
#region TestCase1 // ************************************************************************************************** // This code block handles the first Layer in the LayerCollection defined in XAML. The Initialized // and InitializationFailed Events are for an ArcGITiledMapServiceLayer with the ID of // "World_Light_Gray_Base". The Layer should load with out any errors, use break points to see how the // code execution occurs when the application loads initially. The Initialized Event should fire without // issue. If there are no problems with the Layer loading the InitializationFailed should not execute. private void ArcGISTiledMapServiceLayer_Initialized(object sender, System.EventArgs e) { // Get the ArcGISTiledMapServiceLayer from what was defined in XAML. Using the 'sender' in this case. ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer myArcGISTiledMapServiceLayer = null; myArcGISTiledMapServiceLayer = (ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer)sender; // It is a good practice to check the ArcGISTiledMapServiceLayer.InitializationFailure Property to ensure // that it is null and write your code to do whatever needs done within that if statement. The // reason is that the ArcGISTiledMapServiceLayer.Initialized Event ALWAYS executes before the // ArcGISTiledMapServiceLayer.InitializationFailed Event. By using the // ArcGISTiledMapServiceLayer.InitializationFailure Property to test if no errors are occuring, your code // can execute as expected without runtime errors. Use the ArcGISTiledMapServiceLayer.InitializationFailed // Event to trap for any error and handle appropriately. The ArcGISTiledMapServiceLayer.InitializationFailed // Event will only execute if there is an error. if (myArcGISTiledMapServiceLayer.InitializationFailure == null) { string myID = myArcGISTiledMapServiceLayer.ID; string myMapName = myArcGISTiledMapServiceLayer.MapName; } } private void ArcGISTiledMapServiceLayer_InitializationFailed(object sender, System.EventArgs e) { // The ArcGISTiledMapServiceLayer.InitializationFailed Event only fires when there is a problem with // the Layer. This would be a good place to handle errors, display information about the issue to the // user, and take the corrective action if necessary. // Get the ArcGISTiledMapServiceLayer from what was defined in XAML. Using the 'sender' in this case. ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer myArcGISTiledMapServiceLayer = null; myArcGISTiledMapServiceLayer = (ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer)sender; // Display the error to the user in a MessageBox. The ArcGISTiledMapServiceLayer.InitializationFailure // Property returns a System.Exception object. It has many Properties that can be interrogated // to figure out what the issue is and take action. Two very helpful Properties on the // System.Exception are the .InnerException and .Message. Use the other System.Exception // Properties as needed. Note: there is no need to test if we have an error using the // ArcGISTiledMapServiceLayer.InitializationFailure Property because this whole function would not // execute unless we had an error. System.Exception myGeneralException = myArcGISTiledMapServiceLayer.InitializationFailure; string myMessage = myGeneralException.Message; string myInnerException = myGeneralException.InnerException.ToString(); MessageBox.Show(myMessage + Environment.NewLine + myInnerException, "ArcGISTiledMapServiceLayer_InitializationFailed", MessageBoxButton.OK); } // ************************************************************************************************** #endregion #region TestCase2 // ************************************************************************************************** // This code block handles the second Layer in the LayerCollection defined in XAML. The Initialized // and InitializationFailed Events are for an ArcGIDynamicMapServiceLayer with the ID of // "Population_Change". The Layer should load with out any errors, use break points to see how the // code execution occurs when the application loads initially. The Initialized Event should fire without // issue. If there are no problems with the Layer loading the InitializationFailed should not execute. private void ArcGISDynamicMapServiceLayer_Initialized(object sender, System.EventArgs e) { // Get the ArcGISDynamicMapServiceLayer from what was defined in XAML. Using the item ID in this case. ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer myArcGISDynamicMapServiceLayer = null; myArcGISDynamicMapServiceLayer = (ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer)Map1.Layers["Population_Change"]; // It is a good practice to check the ArcGISDynamicMapServiceLayer.InitializationFailure Property to ensure // that it is null and write your code to do whatever needs done within that if statement. The // reason is that the ArcGISDynamicMapServiceLayer.Initialized Event ALWAYS executes before the // ArcGISDynamicMapServiceLayer.InitializationFailed Event. By using the // ArcGISDynamicMapServiceLayer.InitializationFailure Property to test if no errors are occuring, your code // can execute as expected without runtime errors. Use the ArcGISDynamicMapServiceLayer.InitializationFailed // Event to trap for any error and handle appropriately. The ArcGISDynamicMapServiceLayer.InitializationFailed // Event will only execute if there is an error. if (myArcGISDynamicMapServiceLayer.InitializationFailure == null) { string myID = myArcGISDynamicMapServiceLayer.ID; string myMapName = myArcGISDynamicMapServiceLayer.MapName; } } private void ArcGISDynamicMapServiceLayer_InitializationFailed(object sender, System.EventArgs e) { // The ArcGISDynamicMapServiceLayer.InitializationFailed Event only fires when there is a problem with // the Layer. This would be a good place to handle errors, display information about the issue to the // user, and take the corrective action if necessary. // Get the ArcGISDynamicMapServiceLayer from what was defined in XAML. Using the item ID in this case. ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer myArcGISDynamicMapServiceLayer = null; myArcGISDynamicMapServiceLayer = (ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer)Map1.Layers["Population_Change"]; // Display the error to the user in a MessageBox. The ArcGISDynamicMapServiceLayer.InitializationFailure // Property returns a System.Exception object. It has many Properties that can be interrogated // to figure out what the issue is and take action. Two very helpful Properties on the // System.Exception are the .InnerException and .Message. Use the other System.Exception // Properties as needed. Note: there is no need to test if we have an error using the // ArcGISDynamicMapServiceLayer.InitializationFailure Property because this whole function would not // execute unless we had an error. System.Exception myGeneralException = myArcGISDynamicMapServiceLayer.InitializationFailure; string myMessage = myGeneralException.Message; string myInnerException = myGeneralException.InnerException.ToString(); MessageBox.Show(myMessage + Environment.NewLine + myInnerException, "ArcGISDynamicMapServiceLayer_InitializationFailed", MessageBoxButton.OK); } // ************************************************************************************************** #endregion #region TestCase3 // ************************************************************************************************** // This code block handles the third, fourth, and fifth Layers in the LayerCollection defined in XAML. The // Initialized and InitializationFailed Events are for an FeatureLayer with the IDs of // "Earthquakes" and "BOGUS" AND the ArcGISTiledMapServiceLayer with the ID of "MyPoints_WithProblems". // The "Earthquakes" Layer should load with out any errors. The "BOGUS" and "MyPoints_WithProblems" Layers // intentionally have problems with their URLs and will have runtime errors occuring. Use break points // to see how the code execution occurs when the application loads initially. Remember the Initialized // Event always fires first and then if there are problems with the Layer the InitializationFailed Event // will fire. private void Generic_Layer_Initialized(object sender, System.EventArgs e) { // Get the Layer from what was defined in XAML. Using the 'sender' in this case. We are using // the generic Layer Type for the 'sender' at this point and will cast to a more specific Layer // Type after we have determined that we do not have any errors. ESRI.ArcGIS.Client.Layer myGenericLayer = (ESRI.ArcGIS.Client.Layer)sender; // It is a good practice to check the Layer.InitializationFailure Property to ensure that it is null // and write your code to do whatever needs done within that if statement. The reason is that the // Layer.Initialized Event ALWAYS executes before the Layer.InitializationFailed Event. By using the // Layer.InitializationFailure Property to test if no errors are occuring, your code can execute as // expected without runtime errors. Use the Layer.InitializationFailed Event to trap for any error and // handle appropriately. The Layer.InitializationFailed Event will only execute if there is an error. if (myGenericLayer.InitializationFailure == null) { string myID = null; // Do 'is' testing to see exactly what Type of Layer we have and then branch the code accordingly. if (myGenericLayer is ESRI.ArcGIS.Client.FeatureLayer) { // We have a FeatureLayer. ESRI.ArcGIS.Client.FeatureLayer myFeatureLayer = null; myFeatureLayer = (ESRI.ArcGIS.Client.FeatureLayer)myGenericLayer; myID = myFeatureLayer.ID; } else if (myGenericLayer is ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer) { // We have an ArcGISTiledMapServiceLayer. ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer myArcGISTiledMapServiceLayer = null; myArcGISTiledMapServiceLayer = (ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer)myGenericLayer; myID = myArcGISTiledMapServiceLayer.ID; } else { // TODO: There are several other Layer Types. Write you own code accordingly. } } } private void Generic_Layer_InitializationFailed(object sender, System.EventArgs e) { // The Layer.InitializationFailed Event only fires when there is a problem with the Layer. This would // be a good place to handle errors, display information about the issue to the user, and take the // corrective action if necessary. // Get the Layer from what was defined in XAML. Using the 'sender' in this case. We are using // the generic Layer Type for the 'sender' at this point and could cast to a more specific Layer // Type if desired. ESRI.ArcGIS.Client.Layer myGenericLayer = (ESRI.ArcGIS.Client.Layer)sender; // Display the error to the user in a MessageBox. The Layer.InitializationFailure Property returns // a System.Exception object. It has many Properties that can be interrogated to figure out what the // issue is and take action. Two very helpful Properties on the System.Exception are the .InnerException // and .Message. Use the other System.Exception Properties as needed. Note: there is no need to test if // we have an error using the Layer.InitializationFailure Property because this whole function would not // execute unless we had an error. // In .NET there are numerous Exception Types. The System.Exception is the base for many other // Exception Types. This code block has been enhanced as compared to the other InitializationFailed // functions above to cast the generic System.Exception into more specific Types like: // System.NotSupportedException, System.Security.SecurityException, System.Net.WebException, etc. // Modify the code to catch even more errors Types as needed. System.Exception myGeneralException = myGenericLayer.InitializationFailure; string myMessage = ""; string myInnerException = ""; if (myGeneralException is System.NotSupportedException) { System.NotSupportedException myNotSupportedException = (System.NotSupportedException)myGeneralException; if (myNotSupportedException.Message != null) { myMessage = myNotSupportedException.Message; } if (myNotSupportedException.InnerException != null) { myInnerException = myNotSupportedException.InnerException.ToString(); } } else if (myGeneralException is System.Security.SecurityException) { System.Security.SecurityException mySecurityException = (System.Security.SecurityException)myGeneralException; if (mySecurityException.Message != null) { myMessage = mySecurityException.Message; } if (mySecurityException.InnerException != null) { myInnerException = mySecurityException.InnerException.ToString(); } } else if (myGeneralException is System.Net.WebException) { System.Net.WebException myWebException = (System.Net.WebException)myGeneralException; if (myWebException.Message != null) { myMessage = myWebException.Message; } if (myWebException.InnerException != null) { myInnerException = myWebException.InnerException.ToString(); } } MessageBox.Show(myMessage + Environment.NewLine + myInnerException, "Layer_InitializationFailed", MessageBoxButton.OK); } // ************************************************************************************************** #endregion |
VB.NET | Copy Code |
---|---|
#Region "TestCase1" ' ************************************************************************************************** ' This code block handles the first Layer in the LayerCollection defined in XAML. The Initialized ' and InitializationFailed Events are for an ArcGITiledMapServiceLayer with the ID of ' "World_Light_Gray_Base". The Layer should load with out any errors, use break points to see how the ' code execution occurs when the application loads initially. The Initialized Event should fire without ' issue. If there are no problems with the Layer loading the InitializationFailed should not execute. Private Sub ArcGISTiledMapServiceLayer_Initialized(sender As System.Object, e As System.EventArgs) ' Get the ArcGISTiledMapServiceLayer from what was defined in XAML. Using the 'sender' in this case. Dim myArcGISTiledMapServiceLayer As ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer myArcGISTiledMapServiceLayer = CType(sender, ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer) ' It is a good practice to check the ArcGISTiledMapServiceLayer.InitializationFailure Property to ensure ' that it is Nothing and write your code to do whatever needs done within that If/Then statement. The ' reason is that the ArcGISTiledMapServiceLayer.Initialized Event ALWAYS executes before the ' ArcGISTiledMapServiceLayer.InitializationFailed Event. By using the ' ArcGISTiledMapServiceLayer.InitializationFailure Property to test if no errors are occuring, your code ' can execute as expected without runtime errors. Use the ArcGISTiledMapServiceLayer.InitializationFailed ' Event to trap for any error and handle appropriately. The ArcGISTiledMapServiceLayer.InitializationFailed ' Event will only execute if there is an error. If myArcGISTiledMapServiceLayer.InitializationFailure Is Nothing Then Dim myID As String = myArcGISTiledMapServiceLayer.ID Dim myMapName As String = myArcGISTiledMapServiceLayer.MapName End If End Sub Private Sub ArcGISTiledMapServiceLayer_InitializationFailed(sender As System.Object, e As System.EventArgs) ' The ArcGISTiledMapServiceLayer.InitializationFailed Event only fires when there is a problem with ' the Layer. This would be a good place to handle errors, display information about the issue to the ' user, and take the corrective action if necessary. ' Get the ArcGISTiledMapServiceLayer from what was defined in XAML. Using the 'sender' in this case. Dim myArcGISTiledMapServiceLayer As ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer myArcGISTiledMapServiceLayer = CType(sender, ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer) ' Display the error to the user in a MessageBox. The ArcGISTiledMapServiceLayer.InitializationFailure ' Property returns a System.Exception object. It has many Properties that can be interrogated ' to figure out what the issue is and take action. Two very helpful Properties on the ' System.Exception are the .InnerException and .Message. Use the other System.Exception ' Properties as needed. Note: there is no need to test if we have an error using the ' ArcGISTiledMapServiceLayer.InitializationFailure Property because this whole function would not ' execute unless we had an error. Dim myGeneralException As System.Exception = myArcGISTiledMapServiceLayer.InitializationFailure Dim myMessage As String = myGeneralException.Message Dim myInnerException As String = myGeneralException.InnerException.ToString MessageBox.Show(myMessage + vbCrLf + myInnerException, "ArcGISTiledMapServiceLayer_InitializationFailed", MessageBoxButton.OK) End Sub ' ************************************************************************************************** #End Region #Region "TestCase2" ' ************************************************************************************************** ' This code block handles the second Layer in the LayerCollection defined in XAML. The Initialized ' and InitializationFailed Events are for an ArcGIDynamicMapServiceLayer with the ID of ' "Population_Change". The Layer should load with out any errors, use break points to see how the ' code execution occurs when the application loads initially. The Initialized Event should fire without ' issue. If there are no problems with the Layer loading the InitializationFailed should not execute. Private Sub ArcGISDynamicMapServiceLayer_Initialized(sender As System.Object, e As System.EventArgs) ' Get the ArcGISDynamicMapServiceLayer from what was defined in XAML. Using the item ID in this case. Dim myArcGISDynamicMapServiceLayer As ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer myArcGISDynamicMapServiceLayer = Map1.Layers.Item("Population_Change") ' It is a good practice to check the ArcGISDynamicMapServiceLayer.InitializationFailure Property to ensure ' that it is Nothing and write your code to do whatever needs done within that If/Then statement. The ' reason is that the ArcGISDynamicMapServiceLayer.Initialized Event ALWAYS executes before the ' ArcGISDynamicMapServiceLayer.InitializationFailed Event. By using the ' ArcGISDynamicMapServiceLayer.InitializationFailure Property to test if no errors are occuring, your code ' can execute as expected without runtime errors. Use the ArcGISDynamicMapServiceLayer.InitializationFailed ' Event to trap for any error and handle appropriately. The ArcGISDynamicMapServiceLayer.InitializationFailed ' Event will only execute if there is an error. If myArcGISDynamicMapServiceLayer.InitializationFailure Is Nothing Then Dim myID As String = myArcGISDynamicMapServiceLayer.ID Dim myMapName As String = myArcGISDynamicMapServiceLayer.MapName End If End Sub Private Sub ArcGISDynamicMapServiceLayer_InitializationFailed(sender As System.Object, e As System.EventArgs) ' The ArcGISDynamicMapServiceLayer.InitializationFailed Event only fires when there is a problem with ' the Layer. This would be a good place to handle errors, display information about the issue to the ' user, and take the corrective action if necessary. ' Get the ArcGISDynamicMapServiceLayer from what was defined in XAML. Using the item ID in this case. Dim myArcGISDynamicMapServiceLayer As ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer myArcGISDynamicMapServiceLayer = Map1.Layers.Item("Population_Change") ' Display the error to the user in a MessageBox. The ArcGISDynamicMapServiceLayer.InitializationFailure ' Property returns a System.Exception object. It has many Properties that can be interrogated ' to figure out what the issue is and take action. Two very helpful Properties on the ' System.Exception are the .InnerException and .Message. Use the other System.Exception ' Properties as needed. Note: there is no need to test if we have an error using the ' ArcGISDynamicMapServiceLayer.InitializationFailure Property because this whole function would not ' execute unless we had an error. Dim myGeneralException As System.Exception = myArcGISDynamicMapServiceLayer.InitializationFailure Dim myMessage As String = myGeneralException.Message Dim myInnerException As String = myGeneralException.InnerException.ToString MessageBox.Show(myMessage + vbCrLf + myInnerException, "ArcGISDynamicMapServiceLayer_InitializationFailed", MessageBoxButton.OK) End Sub ' ************************************************************************************************** #End Region #Region "TestCase3" ' ************************************************************************************************** ' This code block handles the third, fourth, and fifth Layers in the LayerCollection defined in XAML. The ' Initialized and InitializationFailed Events are for an FeatureLayer with the IDs of ' "Earthquakes" and "BOGUS" AND the ArcGISTiledMapServiceLayer with the ID of "MyPoints_WithProblems". ' The "Earthquakes" Layer should load with out any errors. The "BOGUS" and "MyPoints_WithProblems" Layers ' intentionally have problems with their URLs and will have runtime errors occuring. Use break points ' to see how the code execution occurs when the application loads initially. Remember the Initialized ' Event always fires first and then if there are problems with the Layer the InitializationFailed Event ' will fire. Private Sub Generic_Layer_Initialized(sender As System.Object, e As System.EventArgs) ' Get the Layer from what was defined in XAML. Using the 'sender' in this case. We are using ' the generic Layer Type for the 'sender' at this point and will cast to a more specific Layer ' Type after we have determined that we do not have any errors. Dim myGenericLayer As ESRI.ArcGIS.Client.Layer = CType(sender, ESRI.ArcGIS.Client.Layer) ' It is a good practice to check the Layer.InitializationFailure Property to ensure that it is Nothing ' and write your code to do whatever needs done within that If/Then statement. The reason is that the ' Layer.Initialized Event ALWAYS executes before the Layer.InitializationFailed Event. By using the ' Layer.InitializationFailure Property to test if no errors are occuring, your code can execute as ' expected without runtime errors. Use the Layer.InitializationFailed Event to trap for any error and ' handle appropriately. The Layer.InitializationFailed Event will only execute if there is an error. If myGenericLayer.InitializationFailure Is Nothing Then Dim myID As String = Nothing ' Do TypeOf testing to see exactly what Type of Layer we have and then branch the code accordingly. If TypeOf myGenericLayer Is ESRI.ArcGIS.Client.FeatureLayer Then ' We have a FeatureLayer. Dim myFeatureLayer As ESRI.ArcGIS.Client.FeatureLayer myFeatureLayer = CType(myGenericLayer, ESRI.ArcGIS.Client.FeatureLayer) myID = myFeatureLayer.ID ElseIf TypeOf myGenericLayer Is ESRI.ArcGIS.Client.ArcGISDynamicMapServiceLayer Then ' We have an ArcGISTiledMapServiceLayer. Dim myArcGISTiledMapServiceLayer As ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer myArcGISTiledMapServiceLayer = CType(myGenericLayer, ESRI.ArcGIS.Client.ArcGISTiledMapServiceLayer) myID = myArcGISTiledMapServiceLayer.ID Else ' TODO: There are several other Layer Types. Write you own code accordingly. End If End If End Sub Private Sub Generic_Layer_InitializationFailed(sender As System.Object, e As System.EventArgs) ' The Layer.InitializationFailed Event only fires when there is a problem with the Layer. This would ' be a good place to handle errors, display information about the issue to the user, and take the ' corrective action if necessary. ' Get the Layer from what was defined in XAML. Using the 'sender' in this case. We are using ' the generic Layer Type for the 'sender' at this point and could cast to a more specific Layer ' Type if desired. Dim myGenericLayer As ESRI.ArcGIS.Client.Layer = CType(sender, ESRI.ArcGIS.Client.Layer) ' Display the error to the user in a MessageBox. The Layer.InitializationFailure Property returns ' a System.Exception object. It has many Properties that can be interrogated to figure out what the ' issue is and take action. Two very helpful Properties on the System.Exception are the .InnerException ' and .Message. Use the other System.Exception Properties as needed. Note: there is no need to test if ' we have an error using the Layer.InitializationFailure Property because this whole function would not ' execute unless we had an error. ' In .NET there are numerous Exception Types. The System.Exception is the base for many other ' Exception Types. This code block has been enhanced as compared to the other InitializationFailed ' functions above to cast the generic System.Exception into more specific Types like: ' System.NotSupportedException, System.Security.SecurityException, System.Net.WebException, etc. ' Modify the code to catch even more errors Types as needed. Dim myGeneralException As System.Exception = myGenericLayer.InitializationFailure Dim myMessage As String = "" Dim myInnerException As String = "" If TypeOf myGeneralException Is System.NotSupportedException Then Dim myNotSupportedException As System.NotSupportedException = myGeneralException If myNotSupportedException.Message IsNot Nothing Then myMessage = myNotSupportedException.Message End If If myNotSupportedException.InnerException IsNot Nothing Then myInnerException = myNotSupportedException.InnerException.ToString End If ElseIf TypeOf myGeneralException Is System.Security.SecurityException Then Dim mySecurityException As System.Security.SecurityException = myGeneralException If mySecurityException.Message IsNot Nothing Then myMessage = mySecurityException.Message End If If mySecurityException.InnerException IsNot Nothing Then myInnerException = mySecurityException.InnerException.ToString End If ElseIf TypeOf myGeneralException Is System.Net.WebException Then Dim myWebException As System.Net.WebException = myGeneralException If myWebException.Message IsNot Nothing Then myMessage = myWebException.Message End If If myWebException.InnerException IsNot Nothing Then myInnerException = myWebException.InnerException.ToString End If End If MessageBox.Show(myMessage + vbCrLf + myInnerException, "Layer_InitializationFailed", MessageBoxButton.OK) End Sub ' ************************************************************************************************** #End Region |
Target Platforms: Windows XP Professional, Windows Server 2003 family, Windows Vista, Windows Server 2008 family, Windows 7