在单个文件中保存和打开多个图表控件

Saving and opening multiple DiagramControls in single file

在我的应用程序中,我展示了两个图表控件,即一个用于前卡,一个用于后卡。现在在添加任意数量的形状、线条和图像之后。我还添加了一个带有数据源的仪表板设计器表单。我想将这个图表控件、具有数据源属性的仪表板设计器和额外的自定义属性(比如我的自定义 class 与原始数据类型和自定义数据类型)保存在单个文件中作为模板,然后当我打开它时单个模板文件,图表控件、仪表板设计器和其他属性都将像以前一样加载所有形状、线条和图像。

为了保存多个图表控件和连接属性,我创建了自己的 class 成员来保存这些信息,例如

public class TemplateClass
{
    public string[] DiagramControlsXMLs;
    public string SqlDataSourceXML { get; set; }
    public string TemplateName { get; set; }    
    ///add more other properties
}

然后在保存模板的时候,暂时保存图表控件,将其内容存储在TamplateClass字符串变量中,如

//save it with temporary name
diagControlA.SaveDocument(strTempFileName);
string strXML = "";
if (File.Exists(strTempFileName))
{
    //read XML based diagram control file
    strXML = File.ReadAllText(strTempFileName);
    File.Delete(strTempFileName);
}

if (objTemplate.DiagramControlsXMLs == null)
    objTemplate.DiagramControlsXMLs = new string[0];

Array.Resize(ref objTemplate.DiagramControlsXMLs, objTemplate.DiagramControlsXMLs.Length + 1);
objTemplate.DiagramControlsXMLs[objTemplate.DiagramControlsXMLs.Length - 1] = strXML;

还要保存连接属性,暂时保存其对应的 XML 并加载到模板 class 变量中,例如

XElement objXE = GM.objDataSources.objSqlDataSource.SaveToXml();
objXE.Save(strTempFileName);

if (File.Exists(strTempFileName))
{
    //store Sql Data source xml string
    objTemplate.SqlDataSourceXML = File.ReadAllText(strTempFileName);
    File.Delete(strTempFileName);
}

最后将模板 class 对象序列化为基于 json 的字符串,并按名称和扩展名将其保存为文件,如

DataContractJsonSerializer objJS = new DataContractJsonSerializer(typeof(TemplateClass));
MemoryStream objMS = new MemoryStream();
objJS.WriteObject(objMS, objTemplate);

string str = Encoding.Default.GetString(objMS.ToArray());
using (StreamWriter objSW = new StreamWriter(strTemplateFilePath, false))
{
    objSW.Write(str);
    objSW.Close();
}

现在打开此模板文件,应用相反的过程加载图表控件及其项目和连接参数及其属性。