throw new Exception(\
m_array.RemoveAt(Index); }
///
/// Reset the Maps array /// public void Reset() {
m_array.Clear(); }
///
/// Get the number of Maps in the collection /// public int Count {
get {
return m_array.Count; } }
///
/// Return the Map at the given index ///
///
public IMap get_Item(int Index) {
if (Index > m_array.Count || Index < 0)
throw new Exception(\
return m_array[Index] as IMap; }
///
/// Remove the instance of the given Map ///
///
m_array.Remove(Map); }
///
/// Create a new Map, add it to the collection and return it to the caller ///
///
IMap newMap = new MapClass(); m_array.Add(newMap);
return newMap; }
///
/// Add the given Map to the collection ///
///
if (Map == null)
throw new Exception(\
m_array.Add(Map); }
#endregion } }
3、新建打开文档类OpenNewMapDocument
由于从工具栏自带的打开按钮打开地图文档的时候,不会自动进行两种视图之间的同步,所以我们要自己派生一个OpenNewMapDocument类,用于打开地图文档。 右击项目名,选择“添加|类”,再选择ArcGIS类别中的BaseCommand模板,输入类名为“OpenNewMapDocument.cs”。 首先添加引用:
using System.Windows.Forms; using ESRI.ArcGIS.Carto; 再添加如下成员变量:
private ControlsSynchronizer m_controlsSynchronizer = null; 修改默认的构造函数如下所示:
//添加参数
public OpenNewMapDocument(ControlsSynchronizer controlsSynchronizer) {
//
// TODO: Define values for the public properties // //设定相关属性值
base.m_category = \ base.m_caption = \ //localizable text
base.m_message = \ //localizable text base.m_toolTip = \ //localizable text
base.m_name = \ //unique id, non-localizable (e.g. \
//初始化m_controlsSynchronizer
m_controlsSynchronizer = controlsSynchronizer; try {
//
// TODO: change bitmap name if necessary //
string bitmapResourceName = GetType().Name + \
base.m_bitmap = new Bitmap(GetType(), bitmapResourceName); }
catch (Exception ex) {
System.Diagnostics.Trace.WriteLine(ex.Message, \ } }
再在OnClick函数中添加如下代码:
public override void OnClick() {
// TODO: Add OpenNewMapDocument.OnClick implementation OpenFileDialog dlg = new OpenFileDialog(); dlg.Filter = \ dlg.Multiselect = false;
dlg.Title = \
if (dlg.ShowDialog() == DialogResult.OK) {
string docName = dlg.FileName;
IMapDocument mapDoc = new MapDocumentClass();
if (mapDoc.get_IsPresent(docName) && !mapDoc.get_IsPasswordProtected(docName)) {
mapDoc.Open(docName, string.Empty); IMap map = mapDoc.get_Map(0);
m_controlsSynchronizer.ReplaceMap(map);
mapDoc.Close(); } } }
在添加类时,模板会自动添加一个名为“OpenNewMapDocument.bmp”的图标,你可以自己修改或者替换为打开的文件夹的图标。
4、两种视图的同步
在3sdnMap.cs中添加成员变量,即同步类对象:
private ControlsSynchronizer m_controlsSynchronizer = null;
在Form1_Load函数中进行初始化工作:
//初始化controls synchronization calss m_controlsSynchronizer = new
ControlsSynchronizer(m_mapControl, m_pageLayoutControl);
//把MapControl和PageLayoutControl绑定起来(两个都指向同一个Map),然后设置MapControl为活动的Control m_controlsSynchronizer.BindControls(true);
//为了在切换MapControl和PageLayoutControl视图同步,要添加Framework Control m_controlsSynchronizer.AddFrameworkControl(axToolbarControl1.Object); m_controlsSynchronizer.AddFrameworkControl(this.axTOCControl1.Object);
// 添加打开命令按钮到工具条
OpenNewMapDocument openMapDoc = new OpenNewMapDocument(m_controlsSynchronizer);
axToolbarControl1.AddItem(openMapDoc, -1, 0, false, -1, esriCommandStyles.esriCommandStyleIconOnly);
因为我们自动派生了打开文档类,并自己将其添加到工具条,所以我们就不需要工具条原来的“打开”按钮了,可以ToolbarControl的属性中将其删除。 下面,我们可完成上一讲遗留的功能了。
///
/// 新建地图命令 ///
///
private void New_Click(object sender, EventArgs e) {
//询问是否保存当前地图
DialogResult res = MessageBox.Show(\是否保存当前地图?\\提示\MessageBoxButtons.YesNo, MessageBoxIcon.Question);
if (res == DialogResult.Yes) {
//如果要保存,调用另存为对话框
ICommand command = new ControlsSaveAsDocCommandClass(); if (m_mapControl != null)
command.OnCreate(m_controlsSynchronizer.MapControl.Object); else
command.OnCreate(m_controlsSynchronizer.PageLayoutControl.Object); command.OnClick(); }
//创建新的地图实例
IMap map = new MapClass(); map.Name = \
m_controlsSynchronizer.MapControl.DocumentFilename = string.Empty; //更新新建地图实例的共享地图文档 m_controlsSynchronizer.ReplaceMap(map); }
///
/// 打开地图文档Mxd命令 ///
///
private void Open_Click(object sender, EventArgs e) {
if (this.axMapControl1.LayerCount > 0) {
DialogResult result = MessageBox.Show(\是否保存当前地图?\警告\ MessageBoxButtons.YesNoCancel, MessageBoxIcon.Question); if (result == DialogResult.Cancel) return;
if (result == DialogResult.Yes) this.Save_Click(null, null); }
OpenNewMapDocument openMapDoc = new OpenNewMapDocument(m_controlsSynchronizer);
openMapDoc.OnCreate(m_controlsSynchronizer.MapControl.Object); openMapDoc.OnClick(); }
在添加数据AddData时,我们也要进行地图共享,故在AddData_Click函数后面添加如下代码:
IMap pMap = this.axMapControl1.Map;
this.m_controlsSynchronizer.ReplaceMap(pMap);
在另存为地图文档时,有可能会丢失数据,因此我们需要提示用户以确认操作,故需修改SaveAs_Click函数,如下所示:
///
/// 另存为地图文档命令 ///
///
private void SaveAs_Click(object sender, EventArgs e) {
//如果当前视图为MapControl时,提示用户另存为操作将丢失PageLayoutControl中的设置 if (m_controlsSynchronizer.ActiveControl is IMapControl3) {
if (MessageBox.Show(\另存为地图文档将丢失制版视图的设置\\r\\n您要继续吗?\\提示\MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.No) return;