Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用XML的动态Windows表单列表_C#_.net_Winforms_Button_Csv - Fatal编程技术网

C# 使用XML的动态Windows表单列表

C# 使用XML的动态Windows表单列表,c#,.net,winforms,button,csv,C#,.net,Winforms,Button,Csv,我正在创建一个动态表单,如果我单击“添加”,就会出现一个带有一组按钮的新面板 在这个面板中,我想添加一个列表,它将记住创建了多少个按钮。因此,我想实现一个列表,但我想再次增加,即使我们重新启动控制台 可能有一个技巧可以把它放在一个XML文件中。通过这种方式,我的策略可以用CSV中的最大值重命名,但我不知道如何记录和增加 有什么想法吗 public class SerialStrategyFuture { public string StrategyName { get; set; }

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

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

可能有一个技巧可以把它放在一个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 ";
}

我不确定是否可以序列化utureContainer.Controls列表。因此,我会这样做:

  • 声明按钮列表:

    列表控制器=新列表()

  • 每次用户创建新按钮时: controlList.add(strategyItemFuture)

  • 在程序关闭或其他适当时机时序列化列表:
  • 程序启动时反序列化它
  • 构建一个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;
            }
        }
    }
    
    //
    ///将文件序列化为压缩的XML文件。如果发生错误,则不会捕获异常。
    /// 
    ///类型
    ///物体。
    ///文件名。
    公共静态void序列化XML(T obj,字符串文件名)
    {
    尝试
    {
    XmlSerializer serializer=新的XmlSerializer(typeof(T));
    使用(FileStream fs=newfilestream(fileName,FileMode.Create))
    {
    使用(GZipStream压缩器=新的GZipStream(fs,CompressionMode.Compress))
    {
    序列化器。序列化(压缩器,obj);
    }
    }
    }
    捕获(例外)
    {
    投掷;
    }
    }
    /// 
    ///从XML反序列化对象。
    /// 
    ///对象
    ///档案。
    /// 
    ///反序列化的对象
    /// 
    公共静态T反序列化FromXML(字符串文件)
    {
    T结果;
    XmlSerializer ser=新的XmlSerializer(typeof(T));
    使用(FileStream fs=newfilestream(file,FileMode.Open))
    {
    使用(GZipStream解压器=新的GZipStream(fs,CompressionMode.Decompress))
    {
    结果=(T)序列反序列化(解压器);
    返回结果;
    }
    }
    }
    
    }

    用法:
    序列化toxml(controlList,yourPath);
    this.controlList=DeserializeFromXml(yourPath);
    

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

    为什么是csv?只需放入一个类并将其序列化为XML—有足够多的好例子。有什么技巧可以改进实现方法吗?
    Usage:
    SerializeToXML(controlList , yourPath);
      this.controlList = DeserializeFromXml<List<ConsoleStrategyItem>>(yourPath);