前言
上一篇博文简单介绍了控件与控件之间如何关联并且如何释放资源,这个部分主要认识下有关于文件型工作空间的操作。
工作空间是SuperMap中的一个重要的概念,工作空间存储了一个工程项目中所有的数据源,地图的组织关系,工作空间通过其中的数据源集合对象(Datasources),地图集合对象(Maps)来管理其下的数据源和地图。在当前版本中,一个应用程序中允许多个工作空间共存,每个工作空间可以管理自己的一套数据源和地图等。不同的工作空间不可相互操作。
一、有关工作空间常用类说明
Workspace类 | 工作空间是用户的工作环境,主要完成数据的组织和管理,包括打开、关闭、创建、保存工作空间文件。 |
WorkspaceConnectionInfo类 | 工作空间连接信息类包括了工作空间连接的所有信息,如所要连接的服务器名称、数据库名称、用户名、密码等。 |
二、有关工作空间常用方法说明
Workspace.Open() | 用于打开已有的工作空间。 |
Workspace.Save() | 用于将现存的工作空间存盘,不改变原有的名称。 |
Workspace.SaveAs() | 根据给定的工作空间连接信息将工作空间进行另存操作。 |
WorkSpace.Close() | 关闭工作空间。 |
三、界面设计
(1)创建菜单
在上一篇博客的界面设计基础上,在MenuStrip控件中创建有关于文件型工作空间操作的菜单,如下图所示:
(2)创建打开文件对话框控件
OpenFileDialog:是Windows窗体应用程序中的一个对话框控件,用于在应用程序中打开文件时提供一个标准的文件选择界面。通过使用OpenFileDialog,用户可以浏览计算机上的文件系统,选择一个或多个文件,然后将选定的文件路径返回给应用程序,以便应用程序可以打开、读取或处理这些文件。
(3)创建保存文件对话框控件
SaveFileDialog:是Windows窗体应用程序中的一个对话框控件,用于在应用程序中保存文件时提供一个标准的文件保存界面。通过使用SaveFileDialog,用户可以浏览计算机上的文件系统,输入文件名,选择保存的文件类型,然后将保存的文件路径返回给应用程序,以便应用程序可以将数据保存到指定的文件中。
(4)创建右键菜单
ContextMenuStrip:是一个用于创建右键菜单的类,通过ContextMenuStrip控件,可以在窗体或控件上创建一个右键菜单,用户右键单击该窗体或控件时会弹出该菜单,选择相应的操作。
四、菜单栏功能实现
(1)打开工作空间
private void OpenWorkspace_Click(object sender, EventArgs e)
{
//获取对话框
this.openFileDialog1.Title = "打开工作空间";
this.openFileDialog1.FileName = "";
//对打开文件进行格式过滤
this.openFileDialog1.Filter = "工作空间文件 (*.smwu)|*.smwu|工作空间文件 (*.sxwu)|*.sxwu";
//返回文件结果
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//关闭存在的工作空间
D_workspace.Close();
//将文件名作为工作空间名称
string fileName = openFileDialog1.FileName;
//传递工作空间连接信息
WorkspaceConnectionInfo file = new WorkspaceConnectionInfo(fileName);
//打开工作空间
D_workspace.Open(file);
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
}
(2) 保存工作空间
private void SaveWorkspace_Click(object sender, EventArgs e)
{
if (D_workspace.Save())
{
MessageBox.Show("工作空间保存成功!", "提示");
}
else
{
MessageBox.Show("工作空间保存失败!", "提示");
return;
}
}
(3)另存工作空间
private void SaveAsWorkspace_Click(object sender, EventArgs e)
{
//获取对话框
this.saveFileDialog1.Title = "保存工作空间";
//对另存文件进行格式过滤
this.saveFileDialog1.Filter = "SuperMap工作空间文件(*.smwu)|*.smwu|SuperMap工作空间文件(*.sxwu)|*.sxwu";
if (this.saveFileDialog1.FileName != null && this.saveFileDialog1.ShowDialog() == DialogResult.OK)
{
//从 SaveFileDialog控件中获取用户选择的文件名,并去除文件扩展名后赋值给变量name
//这个操作通常用于获取用户选择的文件的纯文件名,而不包括文件的扩展名部分
String name = System.IO.Path.GetFileNameWithoutExtension(this.saveFileDialog1.FileName);
//传递工作空间连接信息
WorkspaceConnectionInfo file = new WorkspaceConnectionInfo();
file.Server = this.saveFileDialog1.FileName;
file.Password = "";
//根据 SaveFileDialog 控件的 FilterIndex属性的值来判断文件的类型
if (this.saveFileDialog1.FilterIndex == 1)
{
file.Type = WorkspaceType.SMWU;
}
else
{
file.Type = WorkspaceType.SXWU;
}
D_workspace.Caption = name;
//另存于指定路径
if (D_workspace.SaveAs(file))
{
MessageBox.Show("工作空间另存成功!");
}
else
{
MessageBox.Show("另存工作空间失败!", "提示");
return;
}
}
}
(4)关闭工作空间
private void CloseWorkspace_Click(object sender, EventArgs e)
{
this.D_workspace.Close();
}
五、右键菜单功能实现
有关于单击工作空间树节点代码如下,右键菜单内按钮的功能代码和上方菜单栏功能代码一致。
//为 D_workspaceControl控件的WorkspaceTree控件的NodeMouseClick事件添加了一个名为tree_NodeMouseClick的事件处理程序
//当单击WorkspaceTree控件的节点时,将触发 tree_NodeMouseClick 事件处理程序,从而执行相关的操作或代码逻辑
this.D_workspaceControl.WorkspaceTree.NodeMouseClick += new TreeNodeMouseClickEventHandler(tree_NodeMouseClick);
private void tree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
//单击Workspace节点时,弹出一个名为 contextMenuStrip_workspace的右键菜单,选择相应的操作
WorkspaceTreeNodeBase treenode = e.Node as WorkspaceTreeNodeBase;
if (treenode.NodeType == WorkspaceTreeNodeDataType.Workspace)
{
treenode.ContextMenuStrip = contextMenuStrip_workspace;
}
}
六、完整实现代码
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using SuperMap.Data;
using SuperMap.Mapping;
using SuperMap.UI;
using SuperMap.Realspace;
namespace WindowsFormsApp1
{
public partial class Form1 : Form
{
private Workspace D_workspace;
private WorkspaceControl D_workspaceControl;
private MapControl D_mapControl;
private SceneControl D_sceneControl;
private LayersControl D_layersControl;
public Form1()
{
String mail = ""; // 需要替换为自己的SuperMap账号
String password = "";
bool login = SuperMap.Data.CloudLicense.Login(mail, password);
InitializeComponent();
D_workspace = new Workspace();
D_workspaceControl = new WorkspaceControl();
//控件始终填充整个父容器
D_workspaceControl.Dock = DockStyle.Fill;
//将指定的控件添加到panel1控件中
splitContainer1.Panel1.Controls.Add(D_workspaceControl);
D_layersControl = new LayersControl();
D_layersControl.Dock = DockStyle.Fill;
splitContainer1.Panel2.Controls.Add(D_layersControl);
D_mapControl = new MapControl();
D_mapControl.Dock = DockStyle.Fill;
//将指定的控件添加到panel1控件中
panel3.Controls.Add(D_mapControl);
D_sceneControl = new SceneControl();
D_sceneControl.Dock = DockStyle.Fill;
panel4.Controls.Add(D_sceneControl);
//为 D_workspaceControl控件的WorkspaceTree控件的NodeMouseClick事件添加了一个名为tree_NodeMouseClick的事件处理程序。
//当单击WorkspaceTree控件的节点时,将触发 tree_NodeMouseClick 事件处理程序,从而执行相关的操作或代码逻辑。
this.D_workspaceControl.WorkspaceTree.NodeMouseClick += new TreeNodeMouseClickEventHandler(tree_NodeMouseClick);
}
private void Form1_Load(object sender, EventArgs e)
{
//工作空间和控件联动
D_workspaceControl.WorkspaceTree.Workspace = D_workspace;
D_mapControl.Map.Workspace = D_workspace;
D_sceneControl.Scene.Workspace = D_workspace;
}
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
D_mapControl.Dispose();
D_layersControl.Dispose();
D_sceneControl.Dispose();
D_workspaceControl.Dispose();
D_workspace.Close();
D_workspace.Dispose();
}
private void OpenWorkspace_Click(object sender, EventArgs e)
{
//获取对话框
this.openFileDialog1.Title = "打开工作空间";
this.openFileDialog1.FileName = "";
//对打开文件进行格式过滤
this.openFileDialog1.Filter = "工作空间文件 (*.smwu)|*.smwu|工作空间文件 (*.sxwu)|*.sxwu";
//返回文件结果
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//关闭存在的工作空间
D_workspace.Close();
//将文件名作为工作空间名称
string fileName = openFileDialog1.FileName;
//传递工作空间连接信息
WorkspaceConnectionInfo file = new WorkspaceConnectionInfo(fileName);
//打开工作空间
D_workspace.Open(file);
//刷新工作空间树
this.D_workspaceControl.WorkspaceTree.Refresh();
}
}
private void SaveWorkspace_Click(object sender, EventArgs e)
{
if (D_workspace.Save())
{
MessageBox.Show("工作空间保存成功!", "提示");
}
else
{
MessageBox.Show("工作空间保存失败!", "提示");
return;
}
}
private void SaveAsWorkspace_Click(object sender, EventArgs e)
{
//获取对话框
this.saveFileDialog1.Title = "保存工作空间";
//对另存文件进行格式过滤
this.saveFileDialog1.Filter = "SuperMap工作空间文件(*.smwu)|*.smwu|SuperMap工作空间文件(*.sxwu)|*.sxwu";
if (this.saveFileDialog1.FileName != null && this.saveFileDialog1.ShowDialog() == DialogResult.OK)
{
//从 SaveFileDialog控件中获取用户选择的文件名,并去除文件扩展名后赋值给变量name
//这个操作通常用于获取用户选择的文件的纯文件名,而不包括文件的扩展名部分
String name = System.IO.Path.GetFileNameWithoutExtension(this.saveFileDialog1.FileName);
//传递工作空间连接信息
WorkspaceConnectionInfo file = new WorkspaceConnectionInfo();
file.Server = this.saveFileDialog1.FileName;
file.Password = "";
//根据 SaveFileDialog 控件的 FilterIndex属性的值来判断文件的类型
if (this.saveFileDialog1.FilterIndex == 1)
{
file.Type = WorkspaceType.SMWU;
}
else
{
file.Type = WorkspaceType.SXWU;
}
D_workspace.Caption = name;
//另存于指定路径
if (D_workspace.SaveAs(file))
{
MessageBox.Show("工作空间另存成功!");
}
else
{
MessageBox.Show("另存工作空间失败!", "提示");
return;
}
}
}
private void CloseWorkspace_Click(object sender, EventArgs e)
{
this.D_workspace.Close();
}
private void tree_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)
{
//单击Workspace节点时,弹出一个名为 contextMenuStrip_workspace的右键菜单,选择相应的操作。
WorkspaceTreeNodeBase treenode = e.Node as WorkspaceTreeNodeBase;
if (treenode.NodeType == WorkspaceTreeNodeDataType.Workspace)
{
treenode.ContextMenuStrip = contextMenuStrip_workspace;
}
}
}
}
七、运行结果
总结
以上就是有关于SuperMap iObjects 11i .NET关于工作空间的操作的一些过程记录,我们下篇博文再见!