序列化图表和其他控件C#

序列化图表和其他控件C#,c#,serialization,charts,xml-serialization,C#,Serialization,Charts,Xml Serialization,所以我尝试序列化我的图表、标签、文本框和组合框,我可以做任何事情,除了把它放在同一个xml文件中,但图表状态是,这就是我在序列化类中所做的 public static void Serialise(Control c, string XmlFileName, List<SampleFileObject> sampleObj) { XmlTextWriter xmlSerialisedForm = new XmlTextWriter(XmlFileName, System.Text

所以我尝试序列化我的图表、标签、文本框和组合框,我可以做任何事情,除了把它放在同一个xml文件中,但图表状态是,这就是我在序列化类中所做的

public static void Serialise(Control c, string XmlFileName, List<SampleFileObject> sampleObj) {
  XmlTextWriter xmlSerialisedForm = new XmlTextWriter(XmlFileName, System.Text.Encoding.Default);
  xmlSerialisedForm.Formatting = Formatting.Indented;
  xmlSerialisedForm.WriteStartDocument();
  xmlSerialisedForm.WriteStartElement("ChildForm");
  // enumerate all controls on the form, and serialise them as appropriate
  AddChildControls(xmlSerialisedForm, c);
  AddSampleList(xmlSerialisedForm, sampleObj);
  xmlSerialisedForm.WriteEndElement(); // ChildForm
  xmlSerialisedForm.WriteEndDocument();
  xmlSerialisedForm.Flush();
  xmlSerialisedForm.Close();
}

private static void AddChildControls(XmlTextWriter xmlSerialisedForm, Control c) {
  foreach (Control childCtrl in c.Controls) {
    if (!(childCtrl is Label)) {
      // serialise this control
      xmlSerialisedForm.WriteStartElement("Control");
      xmlSerialisedForm.WriteAttributeString("Type", childCtrl.GetType().ToString());
      xmlSerialisedForm.WriteAttributeString("Name", childCtrl.Name);
      if (childCtrl is TextBox) {
        xmlSerialisedForm.WriteElementString("Text", ((TextBox)childCtrl).Text);
      } else if (childCtrl is ComboBox) {
        xmlSerialisedForm.WriteElementString("Text", ((ComboBox)childCtrl).Text);
        xmlSerialisedForm.WriteElementString("SelectedIndex", ((ComboBox)childCtrl).SelectedIndex.ToString());
      } else if (childCtrl is ListBox) {
        // need to account for multiply selected items
        ListBox lst = (ListBox)childCtrl;
        if (lst.SelectedIndex == -1) {
          xmlSerialisedForm.WriteElementString("SelectedIndex", "-1");
        } else {
          for (int i = 0; i < lst.SelectedIndices.Count; i++) {
            xmlSerialisedForm.WriteElementString("SelectedIndex", (lst.SelectedIndices[i].ToString()));
          }
        }
      } else if (childCtrl is CheckBox) {
        xmlSerialisedForm.WriteElementString("Checked", ((CheckBox)childCtrl).Checked.ToString());
      }
      else if (childCtrl is Chart)
      {

        ((Chart)childCtrl).Serializer.Content = SerializationContents.Appearance;
        ((Chart)childCtrl).Serializer.SerializableContent += ",DataPoint.AxisLabel, Series.AxisLabels, Series.Name, ChartArea.Name";
        ((Chart)childCtrl).Serializer.Save(xmlSerialisedForm);
      }
publicstaticvoidserialise(控件c、字符串XmlFileName、列表sampleObj){
XmlTextWriter xmlSerialisedForm=新的XmlTextWriter(XmlFileName,System.Text.Encoding.Default);
xmlSerialisedForm.Formatting=格式化.Indented;
xmlSerialisedForm.WriteStartDocument();
xmlSerialisedForm.WriteStarteElement(“子表单”);
//枚举窗体上的所有控件,并根据需要序列化它们
AddChildControls(xmlSerialisedForm,c);
AddSampleList(xmlSerialisedForm,sampleObj);
xmlSerialisedForm.WriteEndElement();//子表单
xmlSerialisedForm.WriteEndDocument();
xmlSerialisedForm.Flush();
xmlSerialisedForm.Close();
}
私有静态void AddChildControls(XmlTextWriter xmlSerialisedForm,控件c){
foreach(c.Controls中的controlchildCtrl){
如果(!(childCtrl是标签)){
//序列化此控件
xmlSerialisedForm.WriteStarteElement(“控件”);
xmlSerialisedForm.WriteAttributeString(“Type”,childCtrl.GetType().ToString());
xmlSerialisedForm.WriteAttributeString(“Name”,childCtrl.Name);
如果(childCtrl是文本框){
xmlSerialisedForm.WriteElementString(“文本”,((文本框)childCtrl.Text);
}else if(childCtrl是组合框){
xmlSerialisedForm.WriteElementString(“文本”,((组合框)childCtrl.Text);
xmlSerialisedForm.WriteElementString(“SelectedIndex”,((组合框)childCtrl).SelectedIndex.ToString());
}else if(childCtrl为列表框){
//需要考虑多个选定项目
列表框lst=(列表框)childCtrl;
如果(lst.SelectedIndex==-1){
xmlSerialisedForm.WriteElementString(“SelectedIndex”,“-1”);
}否则{
for(int i=0;i
我认为这是最重要的部分


谢谢

你做错了。你遇到了问题,因为你没有一个与UI分离的模型。你的模型应该是一组足以完全代表你的UI的数据,将该模型加载到你的UI中应该会重新创建UI状态。然后你序列化模型。你所做的很难看,很难维护和调试,很难扩展。序列化UI…EPIC。只有winforms开发人员才能想出这样的想法。我不知道。这不就是XAML吗?序列化UI?也许XAML是由Windows窗体程序员设计的!;)@MatthewWatson不是真的。XAML描述UI和布局,而不是数据。这家伙在这里所做的完全不尊重f
分离关注点的基本原则
。我在开玩笑!我甚至加入了
;)