【问题标题】:C# - Loading Shapes into PictureBox from a text file with data describing each shapeC# - 将形状从文本文件加载到 PictureBox 中,其中包含描述每个形状的数据
【发布时间】:2018-10-08 22:05:18
【问题描述】:

我有完美的工作代码来加载和保存包含形状类型的文本文件中的形状(我使用一个名为 shapetype 的枚举)、x1、y1(初始鼠标按下位置)坐标和 x2、y2(鼠标拖动到某处并释放左键后鼠标光标的最终位置)。该数据还将形状的颜色存储为一个 rgb int 和一个真/假值,以判断该形状是填充为实心还是仅是轮廓。

我唯一要问的是,我如何才能拥有完全相同的东西,但 我的文本文件的一行中 1 个形状的所有数据 并且仍然能够加载它. 我知道如何将数据保存在一行上,但我不知道如果每个形状的所有内容都在一行上,我将如何加载数据...

现在的代码是:

   private void loadCanvas(List<APShape> shapeList)
        {
            shapeList.Clear();
            string line = "";
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "Shape Data Files | *.shapes";
            if (open.ShowDialog() == DialogResult.OK)
            {
                Stream s = File.Open(open.FileName, FileMode.Open);
                StreamReader sr = new StreamReader(s);
                while (line != null)
                {
                    line = sr.ReadLine();
                    if (line != null)
                    {
                        shapeList.Add(ObjectFromTxt(line));
                        shapeList[shapeList.Count - 1].setColor(Color.FromArgb(int.Parse(sr.ReadLine())));
                        shapeList[shapeList.Count - 1].setX1(int.Parse(sr.ReadLine()));
                        shapeList[shapeList.Count - 1].setY1(int.Parse(sr.ReadLine()));
                        shapeList[shapeList.Count - 1].setX2(int.Parse(sr.ReadLine()));
                        shapeList[shapeList.Count - 1].setY2(int.Parse(sr.ReadLine()));
                        shapeList[shapeList.Count - 1].setSolid(string2bool(sr.ReadLine()));
                        shapeList[shapeList.Count - 1].setPenWidth(float.Parse(sr.ReadLine()));

                    }
                }
                sr.Close();
                canvas.Invalidate();
            }
        }

包含形状数据的文本文件的外观如下: Current file format

【问题讨论】:

  • 你应该研究序列化
  • 你的意思是你想知道如何将数据从一行拆分成一个数组? string.Split(sepl)这样做。只要确保在数据中没有使用分隔符即可。但是:对于更健壮的存储和检索,您可能需要考虑键值对,这只是全面序列化的一小步。
  • 我可以将数据拆分为一个数组,但是我不确定我会从哪里将其加载到我的 APSHAPE 对象列表中
  • 您将使用数组的索引来拉出项目。如果您将行中的所有项目写成相同,则数组的每个索引都将引用该项目。所以数组中的第一项是您的 RGB 颜色,第二项是 x1,依此类推。正确的答案是 New Contributor 所说的。阅读:docs.microsoft.com/en-us/dotnet/csharp/programming-guide/…
  • 我使用了很棒的 newtonsoft json 库并成功地使用序列化来完成这个任务。谢谢大家!

标签: c# string list file


【解决方案1】:

最终结果

  private void saveCanvas()
        {
            SaveFileDialog save = new SaveFileDialog();
            save.DefaultExt = ".shapes";
            save.Filter = "Shapes File (*.shapes) |*.shapes";

            if (save.ShowDialog() == DialogResult.OK)
            {
                File.Delete(save.FileName);
                var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, NullValueHandling = NullValueHandling.Ignore };
                File.WriteAllText(save.FileName, JsonConvert.SerializeObject(shapes, shapes.GetType(), settings));
            }
        }


        private void loadCanvas()
        {
            List<APShape> shapeList = new List<APShape>();
            OpenFileDialog open = new OpenFileDialog();
            open.Filter = "Shapes File (*.shapes) |*.shapes";

            if (open.ShowDialog() == DialogResult.OK)
            {
                shapes.Clear();       /* Clear canvas to make sure we are starting blank */
                canvas.Invalidate();

                var json = File.ReadAllText(open.FileName);
                var settings = new JsonSerializerSettings { TypeNameHandling = TypeNameHandling.Objects, NullValueHandling = NullValueHandling.Ignore };

                shapeList = JsonConvert.DeserializeObject<List<APShape>>(json, settings);

                foreach (var shape in shapeList)
                {
                    shapes.Add(shape);
                }
                canvas.Invalidate();      
            }
    }

【讨论】:

    猜你喜欢
    • 2016-01-20
    • 2017-04-20
    • 2010-10-27
    • 1970-01-01
    • 2020-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多