如何在C#

时间:2019-02-02 11:04:42

标签: c# xml-serialization xmlserializer

我开发一个应用程序,它的用户可以添加一些控件(按钮,标签和...)动态地到面板,然后保存与所有添加的控件的形式。为了节省,我使用XMLSerializer,但它给了我这个错误

  

无法序列化System.ComponentModel.ISite类型的成员System.ComponentModel.Component.Site,因为它是一个接口。

我想知道如何将控件保存在XML文件中?如果不可能,还有其他方法可以做到吗?

修改(适用的解决

我找到了一个很好的项目,正是我想要的:

Easy Form Design at Run Time C# Windows Forms

谢谢

1 个答案:

答案 0 :(得分:0)

控件具有数十个属性。当你创建一个控制,只是设置一些属性,其余保持默认。您只需要保存指定的属性。

创建一个类来存储所需的属性:

public class ControlValueObject
{
    public string Type { get; set; }
    public string Text { get; set; }
    public int Top { get; set; }
    public int Left { get; set; }
    // Add the properties you need
}

然后,创建这些对象的集合和序列化:

var label = new Label { Text = "Sample", Top = 10, Left = 20 };
var button = new Button { Text = "Click", Top = 40, Left = 20 };

panel.Controls.Add(label);
panel.Controls.Add(button);

var controls = panel.Controls.OfType<Control>()
    .Select(c => new ControlValueObject { Type = c.GetType().Name, Text = c.Text, Left = c.Left, Top = c.Top })
    .ToList();

var ser = new XmlSerializer(controls.GetType());
ser.Serialize(stream, controls);

我想,您会猜到如何进行反序列化。