ArcGIS_AddDynamicData_CSharp\ChangeRenderer_ADF.aspx.cs
// 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. // // Illustrates how to change the renderers of existing layers in a pooled ArcGIS Server map service // using Web ADF controls and ArcObjects. The layers are modified in a shallowly stateful way, meaning // that the changes persist in the user's browser, but do not affect the appearance of the map service // when viewed by other clients. public partial class ChangeRenderer_ADF : System.Web.UI.Page { #region Instance Variable Declarations private ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResultCollection _callbackResultCollection = new ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResultCollection(); private ServerObjectStateModifier _serverObjectStateModifier = null; #endregion #region ASP.NET Page Life Cycle Event Handlers public void Page_PreInit(object sender, System.EventArgs eventArgs) { // Instantiate a ServerObjectStateModifier object to use for adding and removing the dynamic layer _serverObjectStateModifier = new ServerObjectStateModifier(); } protected void Page_Load(object sender, System.EventArgs e) { try { // Register the Change and Reset Renderers buttons so they initiate asynchronous // postbacks when clicked ScriptManager1.RegisterAsyncPostBackControl(ChangeRenderersButton); ScriptManager1.RegisterAsyncPostBackControl(ResetRenderersButton); // If the renderers have been changed (indicated by the session variable), then we need to re-apply them // so that the Web ADF components accessing the changed map resources are aware of the change. if ((Session["RendererChanged"] != null) && (bool)Session["RendererChanged"]) ChangeRenderers(ServerObjectStateModifier.RendererAction.ApplyLast); MapResourceManager1.ResourcesDispose += new System.EventHandler(MapResourceManager1_ResourcesDispose); } catch (System.Exception exception) { // Check whether the page is loading asynchronously. if (ScriptManager1.IsInAsyncPostBack) { // Get a callback result that will show an alert with information pertaining to the exception ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult errorCallbackResult = Utility.GetErrorCallback(exception); // Get the control that initiated the postback System.Web.UI.Control control = Utility.GetPostBackControl(Page); // If the control is a Web ADF Control (i.e. WebCotnrol or CompositeControl), add the error // callback to that control's callback results. Otherwise, add the error callback to the // callback results collection member variable, which will be passed to the client in // GetCallbackResult. if (control is ESRI.ArcGIS.ADF.Web.UI.WebControls.WebControl) { ESRI.ArcGIS.ADF.Web.UI.WebControls.WebControl adfWebControl = control as ESRI.ArcGIS.ADF.Web.UI.WebControls.WebControl; adfWebControl.CallbackResults.Add(errorCallbackResult); } else if (control is ESRI.ArcGIS.ADF.Web.UI.WebControls.CompositeControl) { ESRI.ArcGIS.ADF.Web.UI.WebControls.CompositeControl adfCompositeControl = control as ESRI.ArcGIS.ADF.Web.UI.WebControls.CompositeControl; adfCompositeControl.CallbackResults.Add(errorCallbackResult); } else { _callbackResultCollection.Add(errorCallbackResult); ScriptManager1.RegisterDataItem(Page, _callbackResultCollection.ToString(), false); } } else { // Since the page is in full postback, write the javascript alert code directly to the response string jsErrorAlert = string.Format("<script>{0}</script>", Utility.GetJavaScriptErrorString(exception)); Response.Write(jsErrorAlert); } } } #endregion #region Web ADF Control Event Handlers // If the resources' renderers have been changed (indicated by the session variable), then we need to restore them to // their original state before the server context created as a result of the current page request is released. // Otherwise, the altered renderers will be applied to the map service outside the scope of this request, meaning they // will be seen by other clients using the service. void MapResourceManager1_ResourcesDispose(object sender, System.EventArgs e) { if ((Session["RendererChanged"] != null) && (bool)Session["RendererChanged"]) ChangeRenderers(ServerObjectStateModifier.RendererAction.ApplyOriginal); } #endregion #region ASP.NET Web Control Event Handlers public void ResetRenderersButton_Click(object sender, System.EventArgs e) { try { ChangeRenderers(ServerObjectStateModifier.RendererAction.ApplyOriginal); RefreshResourcesAndToc(); // Set the session variables indicating that renderers for the resources in the map are in their // original state. We do this to share this information with the custom map handler. Session["RendererChanged"] = false; } catch (System.Exception exception) { // Get a callback result that will alert the user of the error and add it to the callback results collection ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult errorCallbackResult = Utility.GetErrorCallback(exception); _callbackResultCollection.Add(errorCallbackResult); ScriptManager1.RegisterDataItem(Page, _callbackResultCollection.ToString(), false); } } public void ChangeRenderersButton_Click(object sender, System.EventArgs e) { try { ChangeRenderers(ServerObjectStateModifier.RendererAction.ApplyNew); RefreshResourcesAndToc(); // Set the session variable indicating that renderers for the resources in the map have been changed. // We do this to share this information with the custom map handler. Session["RendererChanged"] = true; } catch (System.Exception exception) { // Get a callback result that will alert the user of the error and add it to the callback results collection ESRI.ArcGIS.ADF.Web.UI.WebControls.CallbackResult errorCallbackResult = Utility.GetErrorCallback(exception); _callbackResultCollection.Add(errorCallbackResult); ScriptManager1.RegisterDataItem(Page, _callbackResultCollection.ToString(), false); } } #endregion #region Instance Methods // Refreshes the Toc and all the resources in the Map private void RefreshResourcesAndToc() { foreach (ESRI.ArcGIS.ADF.Web.UI.WebControls.MapResourceItem mapResourceItem in MapResourceManager1.ResourceItems) Map1.RefreshResource(mapResourceItem.Name); Toc1.Refresh(); Map1.CallbackResults.CopyFrom(Toc1.CallbackResults); _callbackResultCollection.CopyFrom(Map1.CallbackResults); ScriptManager1.RegisterDataItem(Page, _callbackResultCollection.ToString(), false); } // Makes sure each resource in the map is initialized, then uses the ServerObjectStateModifier to apply random simple // renderers to its layers private void ChangeRenderers(ServerObjectStateModifier.RendererAction rendererAction) { foreach (ESRI.ArcGIS.ADF.Web.UI.WebControls.MapResourceItem mapResourceItem in MapResourceManager1.ResourceItems) { if (mapResourceItem.Resource is ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal) { _serverObjectStateModifier.ApplySimpleRenderers(mapResourceItem.Resource as ESRI.ArcGIS.ADF.Web.DataSources.ArcGISServer.MapResourceLocal, rendererAction); } } } #endregion }