About the Graphics layers ToolControl Sample
[C#]
GraphicsLayersListCtrl.cs
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using ESRI.ArcGIS.Controls;
using ESRI.ArcGIS.Carto;
using ESRI.ArcGIS.SystemUI;
using ESRI.ArcGIS.esriSystem;
namespace GraphicsLayerToolControl
{
/// <summary>
/// This user control hosts a combobox which allow the user to control over the active graphics layer
/// </summary>
public partial class GraphicsLayersListCtrl : UserControl
{
#region class members
IMap m_map = null;
UID m_uid = null;
#endregion
#region class constructor
public GraphicsLayersListCtrl()
{
InitializeComponent();
//initialize the UID that will be used later to get the graphics layers
m_uid = new UIDClass();
m_uid.Value = "{34B2EF81-F4AC-11D1-A245-080009B6F22B}"; //graphics layers category
}
#endregion
/// <summary>
/// Get the current map and wire the ActiveViewEvents
/// </summary>
public IMap Map
{
get { return m_map; }
set
{
m_map = value;
if (null == m_map)
return;
//set verbose events in order to be able to listen to the various 'ItemXXX' events
((IViewManager)m_map).VerboseEvents = true;
//register document events in order to listen to layers which gets added or removed
((IActiveViewEvents_Event)m_map).ItemAdded += new IActiveViewEvents_ItemAddedEventHandler(OnItemAdded);
((IActiveViewEvents_Event)m_map).ItemReordered += new IActiveViewEvents_ItemReorderedEventHandler(OnItemReordered);
((IActiveViewEvents_Event)m_map).ItemDeleted += new IActiveViewEvents_ItemDeletedEventHandler(OnItemDeleted);
//populate the combo with a list of the graphics layers
PopulateCombo();
}
}
/// <summary>
/// occurs when the user select an item from the combo
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void cmbGraphicsLayerList_SelectedIndexChanged(object sender, EventArgs e)
{
if (null == m_map)
return;
//get the basic graphics layer from the map
ILayer activeLayer = m_map.BasicGraphicsLayer as ILayer;
//if the name of the selected item is the basic graphics layer, make it the active graphics layer
if (activeLayer.Name == cmbGraphicsLayerList.SelectedItem.ToString())
{
m_map.ActiveGraphicsLayer = m_map.BasicGraphicsLayer as ILayer;
return;
}
//iterate through the graphics layers
IEnumLayer layers = GetGraphicsLayersList();
if (null == layers)
return;
layers.Reset();
ILayer layer = null;
while ((layer = layers.Next()) != null)
{
if (layer is IGroupLayer)
continue;
if (layer is IGraphicsLayer)
{
//make the select item the active graphics layer
if (layer.Name == cmbGraphicsLayerList.SelectedItem.ToString())
m_map.ActiveGraphicsLayer = layer;
}
}
}
/// <summary>
/// get the list of all graphics layers in the map
/// </summary>
/// <returns></returns>
private IEnumLayer GetGraphicsLayersList()
{
IEnumLayer layers = null;
if (null == m_map || 0 == m_map.LayerCount)
return null;
try
{
layers = m_map.get_Layers(m_uid, true);
}
catch (Exception ex)
{
System.Diagnostics.Trace.WriteLine(ex.Message);
return null;
}
return layers;
}
/// <summary>
/// list the graphics layers in the combo and select the active graphics layer
/// </summary>
private void PopulateCombo()
{
if (null == m_map)
return;
//clear the items list of the combo
cmbGraphicsLayerList.Items.Clear();
//add the basic graphics layer name
cmbGraphicsLayerList.Items.Add(((ILayer)m_map.BasicGraphicsLayer).Name);
//get the active graphics layer
ILayer activeLayer = m_map.ActiveGraphicsLayer;
//get the list of all graphics layers in the map
IEnumLayer layers = GetGraphicsLayersList();
if (null != layers)
{
//add the layer names to the combo
layers.Reset();
ILayer layer = null;
while ((layer = layers.Next()) != null)
{
cmbGraphicsLayerList.Items.Add(layer.Name);
}
}
//set the selected item to be the active layer
cmbGraphicsLayerList.SelectedItem = activeLayer.Name;
}
/// <summary>
/// occurs when a layer is being deleted from the map
/// </summary>
/// <param name="Item"></param>
void OnItemDeleted(object Item)
{
PopulateCombo();
}
/// <summary>
/// occurs when a layer is being reordered in the TOC
/// </summary>
/// <param name="Item"></param>
/// <param name="toIndex"></param>
void OnItemReordered(object Item, int toIndex)
{
PopulateCombo();
}
/// <summary>
/// occurs when a layer is being added to the map
/// </summary>
/// <param name="Item"></param>
void OnItemAdded(object Item)
{
PopulateCombo();
}
}
}
[Visual Basic .NET]
GraphicsLayersListCtrl.vb
Imports Microsoft.VisualBasic
Imports System
Imports System.Collections.Generic
Imports System.ComponentModel
Imports System.Drawing
Imports System.Data
Imports System.Text
Imports System.Windows.Forms
Imports ESRI.ArcGIS.Controls
Imports ESRI.ArcGIS.Carto
Imports ESRI.ArcGIS.SystemUI
Imports ESRI.ArcGIS.esriSystem
''' <summary>
''' This user control hosts a combobox which allow the user to control over the active graphics layer
''' </summary>
Partial Public Class GraphicsLayersListCtrl : Inherits UserControl
#Region "class members"
Private m_map As IMap = Nothing
Private m_uid As UID = Nothing
#End Region
#Region "class constructor"
Public Sub New()
InitializeComponent()
'initialize the UID that will be used later to get the graphics layers
m_uid = New UIDClass()
m_uid.Value = "{34B2EF81-F4AC-11D1-A245-080009B6F22B}" 'graphics layers category
End Sub
#End Region
''' <summary>
''' Get the current map and wire the ActiveViewEvents
''' </summary>
Public Property Map() As IMap
Get
Return m_map
End Get
Set(ByVal value As IMap)
m_map = value
If Nothing Is m_map Then
Return
End If
'set verbose events in order to be able to listen to the various 'ItemXXX' events
CType(m_map, IViewManager).VerboseEvents = True
'register document events in order to listen to layers which gets added or removed
AddHandler (CType(m_map, IActiveViewEvents_Event)).ItemAdded, AddressOf OnItemAdded
AddHandler (CType(m_map, IActiveViewEvents_Event)).ItemReordered, AddressOf OnItemReordered
AddHandler (CType(m_map, IActiveViewEvents_Event)).ItemDeleted, AddressOf OnItemDeleted
'populate the combo with a list of the graphics layers
PopulateCombo()
End Set
End Property
''' <summary>
''' occurs when the user select an item from the combo
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
Private Sub cmbGraphicsLayerList_SelectedIndexChanged(ByVal sender As Object, ByVal e As EventArgs) Handles cmbGraphicsLayerList.SelectedIndexChanged
If Nothing Is m_map Then
Return
End If
'get the basic graphics layer from the map
Dim activeLayer As ILayer = TryCast(m_map.BasicGraphicsLayer, ILayer)
'if the name of the selected item is the basic graphics layer, make it the active graphics layer
If activeLayer.Name = cmbGraphicsLayerList.SelectedItem.ToString() Then
m_map.ActiveGraphicsLayer = TryCast(m_map.BasicGraphicsLayer, ILayer)
Return
End If
'iterate through the graphics layers
Dim layers As IEnumLayer = GetGraphicsLayersList()
If Nothing Is layers Then
Return
End If
layers.Reset()
Dim layer As ILayer = layers.Next()
Do While Not layer Is Nothing
If TypeOf layer Is IGroupLayer Then
Continue Do
End If
If TypeOf layer Is IGraphicsLayer Then
'make the select item the active graphics layer
If layer.Name = cmbGraphicsLayerList.SelectedItem.ToString() Then
m_map.ActiveGraphicsLayer = layer
End If
End If
layer = layers.Next()
Loop
End Sub
''' <summary>
''' get the list of all graphics layers in the map
''' </summary>
''' <returns></returns>
Private Function GetGraphicsLayersList() As IEnumLayer
Dim layers As IEnumLayer = Nothing
If Nothing Is m_map OrElse 0 = m_map.LayerCount Then
Return Nothing
End If
Try
layers = m_map.Layers(m_uid, True)
Catch ex As Exception
System.Diagnostics.Trace.WriteLine(ex.Message)
Return Nothing
End Try
Return layers
End Function
''' <summary>
''' list the graphics layers in the combo and select the active graphics layer
''' </summary>
Private Sub PopulateCombo()
If Nothing Is m_map Then
Return
End If
'clear the items list of the combo
cmbGraphicsLayerList.Items.Clear()
'add the basic graphics layer name
cmbGraphicsLayerList.Items.Add((CType(m_map.BasicGraphicsLayer, ILayer)).Name)
'get the active graphics layer
Dim activeLayer As ILayer = m_map.ActiveGraphicsLayer
'get the list of all graphics layers in the map
Dim layers As IEnumLayer = GetGraphicsLayersList()
If Not Nothing Is layers Then
'add the layer names to the combo
layers.Reset()
Dim layer As ILayer = layers.Next()
Do While Not layer Is Nothing
cmbGraphicsLayerList.Items.Add(layer.Name)
layer = layers.Next()
Loop
End If
'set the selected item to be the active layer
cmbGraphicsLayerList.SelectedItem = activeLayer.Name
End Sub
''' <summary>
''' occurs when a layer is being deleted from the map
''' </summary>
''' <param name="Item"></param>
Private Sub OnItemDeleted(ByVal Item As Object)
PopulateCombo()
End Sub
''' <summary>
''' occurs when a layer is being reordered in the TOC
''' </summary>
''' <param name="Item"></param>
''' <param name="toIndex"></param>
Private Sub OnItemReordered(ByVal Item As Object, ByVal toIndex As Integer)
PopulateCombo()
End Sub
''' <summary>
''' occurs when a layer is being added to the map
''' </summary>
''' <param name="Item"></param>
Private Sub OnItemAdded(ByVal Item As Object)
PopulateCombo()
End Sub
End Class