Dropping data onto the MapControl
Do the following steps to drop data onto the MapControl:
- Set the IMapControl4.OleDropEnabled property to true.
- Set the IMapControlEvents2.OnOleDrop event to axMapControl1_OnOleDrop.
- Manage the esriDropEnter action of the onOLEDrop event:
- When dragged, data initially enters the MapControl and the OnOleDrop event is triggered with an esriDropEnter action. The IDataObjectHelper interface is used to determine whether the data is being dragged from ArcCatalog or Windows Explorer using the CanGetNames and CanGetFiles methods. If the data is from ArcCatalog or Windows Explorer, the DragDropEffect is set to esriDragDropCopy; otherwise, it is set to esriDragDropNone. The DragDropEffect is then stored for later use, for example, when the same data is dragged around or dropped onto the MapControl.
- Manage the esriDropOver action of the onOLEDrop event:
- When data is being dragged around the MapControl, the OnOleDrop event is triggered with an esriDropOver action. The DragDropEffect is set to the effect stored when the data initially entered the control.
- Manage the esriDropped action of the onOLEDrop event:
- When data is dropped onto the MapControl, the OnOleDrop event is triggered with an esriDropped action. The IDataObjectHelper interface is used to obtain an array of file path strings from the data using the GetFiles method if the CanGetFiles method returns true; otherwise, an IEnumName collection is obtained using the GetNames method. The CheckMxFile method is used to determine whether each file path in the array is a valid Mx document. If valid, the LoadMxFile method is used to load the document into the MapControl; otherwise, a new IFileName object is created with its path property set to the file path in the array. IFileName is used to create a layer that can be added to the MapControl in the same way that the INames obtained by enumerating the IEnumName collection do.
If dropped from ArcCatalog, Mx document and layer (.lyr) files will return true for CanGetFiles as they are both a type of IFileName.
- Call the CreateLayersFromName method to create a collection of ILayers by using the ILayerFactoryHelper interface. Each layer is then added to the MapControl using the AddLayer method.
Copy and paste the following axMapControl1_OnOleDrop method (for Steps 3-5) and the CreateLayer method (for Step 6) into your application where appropriate:
[C#]
private void axMapControl1_OnOleDrop(object sender,
ESRI.ArcGIS.Controls.IMapControlEvents2_OnOleDropEvent e)
{
//QI for IDataObjectHelper.
IDataObjectHelper dataObject = (IDataObjectHelper)e.dataObjectHelper;
esriControlsDropAction action = e.dropAction;
e.effect = (int)esriControlsDragDropEffect.esriDragDropNone;
//If the mouse has just entered the MapControl.
if (action == esriControlsDropAction.esriDropEnter)
{
//If the data is from Windows Explorer or ArcCatalog.
if (dataObject.CanGetFiles() | dataObject.CanGetNames())
{
//Store the copy effect.
m_Effect = esriControlsDragDropEffect.esriDragDropCopy;
}
}
//If the mouse is moving over the MapControl.
if (action == esriControlsDropAction.esriDropOver)
{
//Set the effect.
e.effect = (int)m_Effect;
}
//If data is dropped onto the MapControl.
if (action == esriControlsDropAction.esriDropped)
{
//If the data is from Windows Explorer.
if (dataObject.CanGetFiles() == true)
{
//Get an array of file paths through the IDataObjectHelper.
System.Array filePaths = System.Array.CreateInstance(typeof(string), 0,
0);
filePaths = (System.Array)dataObject.GetFiles();
//Loop through the array.
for (int i = 0; i <= filePaths.Length - 1; i++)
{
//If a valid Mx document, load it into the MapControl.
if (axMapControl1.CheckMxFile(filePaths.GetValue(i).ToString()) ==
true)
{
try
{
axMapControl1.LoadMxFile(filePaths.GetValue(i).ToString(),
Type.Missing, "");
}
catch (System.Exception ex)
{
MessageBox.Show("Error:" + ex.Message);
return ;
}
}
else
{
//Get the IFileName interface and set its path.
IFileName fileName = new FileNameClass();
fileName.Path = filePaths.GetValue(i).ToString();
//Create a map layer.
CreateLayer((IName)fileName);
}
}
}
//If data is from ArcCatalog.
else if (dataObject.CanGetNames() == true)
{
//Get the IEnumName interface through the IDataObjectHelper.
IEnumName enumName = dataObject.GetNames();
enumName.Reset();
//Get the IName interface.
IName name = enumName.Next();
//Loop through the names.
while (name != null)
{
//Create a map layer.
CreateLayer(name);
name = enumName.Next();
}
}
}
}
//Create a layer or layers from a name and add to MapControl.
private void CreateLayer(IName name)
{
//Set the mouse pointer.
axMapControl1.MousePointer = esriControlsMousePointer.esriPointerHourglass;
//Get the ILayerFactoryHelper interface.
ILayerFactoryHelper layerFactoryHelper = new LayerFactoryHelperClass();
//Get the IEnumLayer interface through the ILayerFatcoryHelper interface.
try
{
IEnumLayer enumLayer = layerFactoryHelper.CreateLayersFromName(name);
enumLayer.Reset();
//Get the ILayer interface.
ILayer layer = enumLayer.Next();
//Loop through layers.
while (layer != null)
{
//Add the layer to the map.
axMapControl1.AddLayer(layer, 0);
layer = enumLayer.Next();
}
}
catch (System.Exception ex)
{
MessageBox.Show("Error:" + ex.Message);
}
//Set the mouse pointer.
axMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault;
}
[VB.NET]
Private Sub AxMapControl1_OnOleDrop(ByVal sender As Object, ByVal e As ESRI.ArcGIS.Controls.IMapControlEvents2_OnOleDropEvent) Handles AxMapControl1.OnOleDrop
On Error GoTo ErrorHandler
'QI for IDataObjectHelper.
Dim pDataObject As IDataObjectHelper
pDataObject = e.dataObjectHelper
Dim action As esriControlsDropAction
action = e.dropAction
e.effect = esriControlsDragDropEffect.esriDragDropNone
'If the mouse has entered the MapControl.
If action = esriControlsDropAction.esriDropEnter Then
'If the data is from Windows Explorer or ArcCatalog.
If pDataObject.CanGetFiles Or pDataObject.CanGetNames Then
'Store the copy effect.
m_pEffect = esriControlsDragDropEffect.esriDragDropCopy
End If
End If
'If the mouse is moving over the MapControl.
If action = esriControlsDropAction.esriDropOver Then
'Set the effect.
e.effect = m_pEffect
End If
'If data is dropped onto the MapControl.
Dim pFilePaths As Object
Dim i As Short
Dim pFileName As IFileName
Dim pEnumName As IEnumName
Dim pName As IName
If action = esriControlsDropAction.esriDropped Then
'If the data is from Windows Explorer.
If pDataObject.CanGetFiles Then
'Get an array of file paths through the IDataObjectHelper.
pFilePaths = pDataObject.GetFiles
'Loop through the array.
For i = LBound(pFilePaths) To UBound(pFilePaths)
'If a valid Mx document, load it into the MapControl.
If AxMapControl1.CheckMxFile(pFilePaths(i)) Then
AxMapControl1.LoadMxFile(pFilePaths(i))
Else
'Get the IFileName interface and set its path.
pFileName = New FileNameClass
pFileName.Path = pFilePaths(i)
'Create a map layer.
CreateLayer(CType(pFileName, IName))
End If
Next
'If data is from ArcCatalog.
ElseIf pDataObject.CanGetNames Then
'Get the IEnumName interface through the IDataObjectHelper.
pEnumName = pDataObject.GetNames
pEnumName.Reset()
'Get the IName interface.
pName = pEnumName.Next
'Loop through the names.
Do While Not pName Is Nothing
'Create a map layer.
CreateLayer(pName)
pName = pEnumName.Next
Loop
End If
End If
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 1031
MsgBox("Unable to load password protected ArcReader files (*.pmf)")
Exit Sub
End Select
End Sub
'Create a layer or layers from a name and add to MapControl.
Public Sub CreateLayer(ByRef pName As IName)
On Error GoTo ErrorHandler
'Set the mouse pointer.
AxMapControl1.MousePointer = esriControlsMousePointer.esriPointerHourglass
'Get the ILayerFactoryHelper interface.
Dim pLayerFactoryHelper As ILayerFactoryHelper
pLayerFactoryHelper = New LayerFactoryHelperClass
'Get the IEnumLayer interface through the ILayerFatcoryHelper interface.
Dim pEnumLayer As IEnumLayer
pEnumLayer = pLayerFactoryHelper.CreateLayersFromName(pName)
pEnumLayer.Reset()
'Get the ILayer interface.
Dim pLayer As ILayer
pLayer = pEnumLayer.Next
'Loop through layers.
Do While Not pLayer Is Nothing
'Add the layer to the map.
AxMapControl1.AddLayer(pLayer)
pLayer = pEnumLayer.Next
Loop
'Set the mouse pointer.
AxMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault
Exit Sub
ErrorHandler:
Select Case Err.Number
Case 1028
MsgBox("Data not supported")
AxMapControl1.MousePointer = esriControlsMousePointer.esriPointerDefault
End Select
End Sub
See Also:
MapControl classIMapControl4 interface
Development licensing | Deployment licensing |
---|---|
Engine Developer Kit | Engine |
ArcGIS for Desktop Basic | |
ArcGIS for Desktop Standard | |
ArcGIS for Desktop Advanced |