ArcGIS Add Dynamic Data
ArcGIS_AddDynamicData_CSharp\ChangeRenderer_ADF.aspx.cs
// Copyright 2011 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
}