【问题标题】:Dynamic Windows form - list with XML动态 Windows 窗体 - 带有 XML 的列表
【发布时间】:2013-05-06 06:42:02
【问题描述】:

我正在创建一个动态表单,如果我单击“添加”,则会出现一个带有一组按钮的新面板。

在这个面板中,我想添加一个列表来记住创建了多少按钮。因此,我想实现一个列表,但即使我们重新启动控制台,我也想再次增加。

可能有将其放入 XML 文件的提示。通过这种方式,我的策略可以用 CSV 中存在的最大值重命名,但我不知道如何记录以及如何增加......

有什么想法吗?

public class SerialStrategyFuture
{
    public string StrategyName { get; set; }
    public string NumStrategy { get; set; }
}

public void CreateStrategyFuture()
{
    ConsoleStrategyItem strategyItemFuture = new ConsoleStrategyItem();
    strategyItemFuture.Location = new Point(3, 3);
    futureContainer.Height += 85;
    futureContainer.Controls.Add(strategyItemFuture);

    SerialStrategyFuture strategyFuture = new SerialStrategyFuture();
    strategyFuture.StrategyName = "Strat Future ";
    strategyFuture.NumStrategy = "How to increment it ???";
    XmlSerializer serializer = new XmlSerializer(typeof(SerialStrategyFuture));
    TextWriter textWriter = new StreamWriter(@"C:\Users\...");
    serializer.Serialize(textWriter,strategyFuture);
    textWriter.Close();

    ConsoleStrategyItem.Instance.txtStrategyName.Text = "Strat Future 1 ";
}

【问题讨论】:

  • 为什么是 csv?只需放入一个类并将其序列化为 XML - 那里有足够好的示例。
  • 有什么建议可以改进实施方式吗?

标签: c# .net winforms button csv


【解决方案1】:

我不确定你是否可以序列化 utureContainer.Controls 列表。因此,我会使用这种方式:

  1. 声明一个按钮列表:

    List controlList = new List();

  2. 每次您的用户创建一个新按钮时: controlList.add(strategyItemFuture);

  3. 在您的程序关闭或其他适当时机时对列表进行序列化:
  4. 在您的程序启动时对其进行反序列化。
  5. 构建一个从反序列化列表中提取按钮的 foreach 循环。

这是我用来序列化/反序列化的两种方法

/// <summary>
/// Serializes a file to a compressed XML file. If an error occurs, the exception is NOT caught.
/// </summary>
/// <typeparam name="T">The Type</typeparam>
/// <param name="obj">The object.</param>
/// <param name="fileName">Name of the file.</param>
public static void SerializeToXML<T>(T obj, string fileName)
{
    try
    {
        XmlSerializer serializer = new XmlSerializer(typeof(T));

        using (FileStream fs = new FileStream(fileName, FileMode.Create))
        {
            using (GZipStream compressor = new GZipStream(fs, CompressionMode.Compress))
            {
                serializer.Serialize(compressor, obj);
            }
        }
    }
    catch (Exception)
    {
        throw;
    }
}

/// <summary>
/// Deserializes an object from XML.
/// </summary>
/// <typeparam name="T">The object</typeparam>
/// <param name="file">The file.</param>
/// <returns>
/// The deserialized object
/// </returns>
public static T DeserializeFromXml<T>(string file)
{
    T result;
    XmlSerializer ser = new XmlSerializer(typeof(T));
    using (FileStream fs = new FileStream(file, FileMode.Open))
    {
        using (GZipStream decompressor = new GZipStream(fs, CompressionMode.Decompress))
        {
            result = (T)ser.Deserialize(decompressor);
            return result;
        }
    }
}

}

Usage:
SerializeToXML(controlList , yourPath);
  this.controlList = DeserializeFromXml<List<ConsoleStrategyItem>>(yourPath);

我所做的不仅仅是存储按钮的数量,但这样做的好处是当你的按钮有更多的逻辑时,你可以存储更多的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多