需要帮助用 json 填充列表框,当前显示空值

Need help populating Listbox with json, currently displaying empty values

我对编程完全陌生, 我试图以 windows 形式创建类似漫画组织工具的东西,但我被困在用反序列化 json 字符串中的数据填充列表框,它目前只正确显示布尔值,所有其他值都是“0”偶数字符串。 我有一个按钮可以执行此操作:

using (OpenFileDialog openFileDialog = new OpenFileDialog() { Filter = "Json Files|*.json", ValidateNames = true, Multiselect = false })
{
    if (openFileDialog.ShowDialog() == DialogResult.OK)
    {
        var fileStream = openFileDialog.OpenFile();
        using (StreamReader sr = new StreamReader(fileStream))
        {
            string fileContent = sr.ReadToEnd();
            ComicList comics = JsonConvert.DeserializeObject<ComicList>(fileContent);
            Manga_listBox.DataSource = DisplayComic.FullList;


            //ignore this little bit it's just so i can see what's happening
            label1.Text = Convert.ToString(comics.Comics.Count);
            label1.Text = Convert.ToString(DisplayComic.FullList);
        }
    }
}

我有以下 class 是这样的:

public class Comic
{
    private string Manga;
    private int Chapters;
    private bool isFinished;
    private int LastReadCH;

    public string Manga1 { get => Manga; set => Manga = value; }
    public int Chapters1 { get => Chapters; set => Chapters = value; }
    public bool IsFinished { get => isFinished; set => isFinished = value; }
    public int LastReadCH1 { get => LastReadCH; set => LastReadCH = value; }



    public Comic(Comic asd)
    {
        this.Manga = Manga1;
        this.Chapters = Chapters1;
        this.IsFinished = IsFinished;
        this.LastReadCH = LastReadCH1;
    }
    public override string ToString()
    {
        return string.Format("{0}, {1}, {2}, {3}",
                this.Manga, this.Chapters, this.IsFinished, this.LastReadCH);
    }

}

public class ComicList
{
    private List<Comic> comics;

    public List<Comic> Comics { get => comics; set => comics = value; }

}

public class DisplayComic
{
    static DisplayComic()
    {
        using (OpenFileDialog openFileDialog = new OpenFileDialog() { Filter = "Json Files|*.json", ValidateNames = true, Multiselect = false })
        {
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                var fileStream = openFileDialog.OpenFile();
                using (StreamReader sr = new StreamReader(fileStream))
                {
                    string fileContent = sr.ReadToEnd();
                    ComicList comics = JsonConvert.DeserializeObject<ComicList>(fileContent);
                    FullList = comics.Comics;


                }
            }
        }
    }

    private static List<Comic> fullList;

    public static List<Comic> FullList { get => fullList; set => fullList = value; }

    public static List<Comic> GetComcis()
    {
        return FullList;
    }


}

代码可能很乱,然后我又是新手,一直在网上关注各种信息,也出于某种原因,打开的对话框windows打开了两次我不明白为什么. 这是我正在使用的 json 文件:

{
  "Comics": [
    {
      "Manga": "MangaNumber1",
      "Chapters": 85,
      "isFinished": true,
      "LastReadCH": 85
    },
    {
      "Manga": "MangaNumber2",
      "Chapters": 112,
      "isFinished": true,
      "LastReadCH": 112
    },
    {
      "Manga": "MangaNumber3",
      "Chapters": 117,
      "isFinished": true,
      "LastReadCH": 117
    },
    {
      "Manga": "MangaNumber4",
      "Chapters": 74,
      "isFinished": true,
      "LastReadCH": 74
    }
  ]
}

我已经尝试了很多人 "expertise" 可以,更改所有类型的变量名称等等,非常感谢您的帮助。

这是问题的屏幕截图: as you can see only the boolean values are actually correct, otherwise they'd be false, all other values though...

编辑: 我想要的结果是用漫画名称填充列表框,(感谢@beeker 属性 的东西),一旦我 select 说了漫画,我就想创建一些其他对象,例如标签和文本框来查看和编辑章节的值等,我也希望能够看到 json 文件正在解析的内容,但是当我这样做时:

                        label1.Text = Convert.ToString(comics);

我得到带有文本 "Manga_Organizer_2.ComicList"

的标签

顺便说一句,当我说我是新手时,我的意思是我只使用 "if" 函数对整个解析 json、openfiledialog 甚至 class 进行控制台应用程序的操作es 用法是全新的。我也没有使用任何其他语言进行编程的背景,C# 是第一个,我喜欢它,即使遇到了可怕的困难:)

Answer/Update: 现在一切都很好:) 我所要做的就是设置

                        DisplayComic.FullList = comics.Comics;

在为列表框设置数据源之前的打开文件对话框中。 最后看起来像这样:


                        string fileContent = sr.ReadToEnd();
                        ComicList comics = JsonConvert.DeserializeObject<ComicList>(fileContent);
                        DisplayComic.FullList = comics.Comics;
                        Manga_listBox.DataSource = DisplayComic.FullList;
                        Manga_listBox.DisplayMember = "manga";

也把漫画class中的封装全部去掉了,最后是这样的:

    public class Comic
    {
        public string Manga { get; set; }
        public double Chapters { get; set; }
        public bool IsFinished { get; set; }
        public double LastReadCH { get; set; }
        public string StartedOn { get; set; }
        public string FinishedOn { get; set; }

    }

还有展示漫画 class 看起来像这样:

    public class DisplayComic
    {
        public static List<Comic> FullList { get; set; }


        public static List<Comic> GetComcis()
        {
            return FullList;
        }
    }

此外,在所有这些麻烦之后,我可以反序列化 json,将其解析为字符串,然后解析为列表,加载、保存和编辑它,我也设法将其序列化回来一起,并与 savefiledialog 一起为它创建一个文件,但是当我这样做时,我将无法再次重新反序列化它,关于 json 的某些东西已经改变(从对象到数组,反之亦然),除了从那以后我也遇到了日期时间问题,无法从字符串中正确加载它等等,无论如何在一系列不幸事件之后,以及 17 小时的乱七八糟地看着代码,我终于完成了我的应用程序:D! 它完成了我想要的一切,加载 json,保存并编辑它,将它放回原处,添加和删除它,我从所有这些麻烦中学到了很多东西,谢谢大家的帮助,感谢你们学会了如何设置要在列表框中显示的内容,而且非常重要的是 "somewhat" 学会了如何调试代码。 谢谢。

尝试设置列表框 "DisplayMember" 属性 以便控件知道您想要查看 class 中的哪个 属性。像这样...

Manga_listBox.DataSource = DisplayComic.FullList;
Manga_listBox.DisplayMember = "Manga";

参考: https://docs.microsoft.com/en-us/dotnet/api/system.windows.forms.listcontrol.displaymember?view=netframework-4.8

回答: 我删除了显示漫画 class 中的整个 openfiledialog,在漫画 class 中重命名封装并完成 :D,现在 openfiledialog 只打开一次并且 json 中的值正确解析为漫画列表,从而使我能够随心所欲地使用它们,谢谢,你用学习调试东西的想法把我推向了正确的方向:D。 现在剩下的就是学习如何通过从列表框中选择不同的行来创建对象,另一个挑战等待着这个新人。