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