开发环境:SuperMap 9.1.1 idesktop dotnet
需求:在打开一个工作空间文件的情况下,实现不关闭组件窗体程序,切换到另外一个工作空间。
尝试了好几种方法,报各种各样的错误,测试情况如下:
情况1: workSpace.Close();程序直接关闭,程序报错
情况2:workSpace.Datasources.CloseAll();,只关闭数据源
情况3:workSpace.Dispose();报错,无法访问已经释放的对象
代码:
/// <summary>
/// 切换工作空间
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void buttonXOk_Click(object sender, EventArgs e)
{
//1.切换工作空间
bool openNewWs = false;
if (workSpace.IsModified)
{
DialogResult dr = MessageBox.Show("工作空间已更改,是否保存?", "保存工作空间", MessageBoxButtons.OKCancel, MessageBoxIcon.Question);
if (dr == DialogResult.OK)
{
bool isSaved = sceneControl.Scene.Workspace.Save();
if (workSpace.Scenes.Count > 0)
{
for (int i = 0; i < workSpace.Scenes.Count; i++)
{
workSpace.Scenes.SetSceneXML(workSpace.Scenes[i], sceneControl.Scene.ToXML());
}
}
bool success = workSpace.Save();
if (success)
{
MessageBox.Show("工作空间保存成功!", "提示");
}
else
{
MessageBox.Show("工作空间保存失败!", "提示");
}
//关闭所有数据源
workSpace.Datasources.CloseAll();
//先关闭工作空间
// workSpace.Close();
//TODO:无法访问已经释放的对象
// workSpace.Dispose();
//打开新场景
OpenWorkSpace(this.comboBoxExWSDS.Text.Trim());
}
else
{
//关闭所有数据源
// workSpace.Datasources.CloseAll();
//先关闭工作空间
// workSpace.Close();
//TODO:无法访问已经释放的对象
workSpace.Dispose();
//打开新场景
OpenWorkSpace(this.comboBoxExWSDS.Text.Trim());
}
}
}
/// <summary>
/// 打开工作空间
/// </summary>
/// <returns></returns>
private void OpenWorkSpace(string workspaceName)
{
bool bOpen = false;
string path = new DirectoryInfo("../../../../").FullName + @"Data\" + workspaceName + ".smwu";
WorkspaceConnectionInfo wsConn = null;
if (File.Exists(path))
{
wsConn = new WorkspaceConnectionInfo(path);
wsConn.Type = WorkspaceType.SMWU;
}
else
{
//路径不存在的操作
MessageBox.Show(path+"路径不存在名为" + workspaceName + "的工作空间!","提示");
}
if (wsConn != null)
{
// workSpace=new Workspace();
bOpen = workSpace.Open(wsConn);
}
// return bOpen;
if (bOpen)
{
MessageBox.Show("场景打开成功!", "提示");
}
else
{
MessageBox.Show("场景打开失败!", "提示");
}
}
请问,这种情况怎么处理呢??