我对编程完全陌生,我试图在windows窗体中创建类似manga组织工具的东西,但我被困在用反序列化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);
}
}
}
我有以下这样的类:
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;
}
}
代码可能很乱,但我还是个新手,一直在网上关注各种信息,也因为某种原因,打开的对话框窗口打开了两次,我不明白为什么。这是我正在使用的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
}
]
}
我已经试过了,任何有我"专业知识"的人都可以,更改各种变量名等等,都会非常感谢帮助。
以下是问题的屏幕截图:正如你所看到的,只有布尔值是正确的,否则它们将是错误的,所有其他值。。。
编辑:我跳出来的结果是用漫画名称填充列表框(感谢@beeker的属性(,一旦我选择了所说的漫画,我就想创建一些其他对象,如标签和文本框,以查看和编辑章节的值等,我也希望能够看到json文件解析了什么:
label1.Text = Convert.ToString(comics);
我得到的标签上写着"Manga_Organizer_2.ComicList">
顺便说一句,当我说im new时,我的意思是我只使用过控制台应用程序,只使用"if"函数——整个解析json、openfiledialog,甚至类的使用都是全新的。我也没有任何其他语言编程的背景,c#是第一语言,尽管有可怕的困难,我还是喜欢它:(
回答/更新:现在一切都很好:(我所要做的就是设置
DisplayComic.FullList = comics.Comics;
在openfiledialog中,然后再为列表框设置数据源。最后看起来是这样的:
string fileContent = sr.ReadToEnd();
ComicList comics = JsonConvert.DeserializeObject<ComicList>(fileContent);
DisplayComic.FullList = comics.Comics;
Manga_listBox.DataSource = DisplayComic.FullList;
Manga_listBox.DisplayMember = "manga";
还删除了漫画类中的封装,最后看起来是这样的:
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; }
}
还有displaycomic类看起来是这样的:
public class DisplayComic
{
public static List<Comic> FullList { get; set; }
public static List<Comic> GetComcis()
{
return FullList;
}
}
此外,在所有这些麻烦出现之后,我可以反序列化json,将其解析为字符串,然后解析为列表,加载、保存和编辑它,我还设法将其重新序列化,并使用savefiledialog为其创建一个文件,但当我这样做时,我将无法再次重新反序列化它,json的某些内容已经改变(从对象到数组,反之亦然(,除此之外,我还遇到了日期时间的问题,无法从字符串中正确加载,等等,无论如何,在经历了一系列不幸之后,我困惑地看了17个小时的代码,最终完成了我的应用程序:D!它做了我想做的一切,加载一个json,保存和编辑它,把它放回一起,添加和删除它,我从所有这些麻烦中学到了很多,感谢大家的帮助,感谢你们学会了如何设置在列表框上显示的东西,也非常重要的是,"在某种程度上"学会了如何调试代码。谢谢
尝试设置listbox"DisplayMember"属性,以便控件知道要查看类的哪个属性。像这样的。。。
Manga_listBox.DataSource = DisplayComic.FullList;
Manga_listBox.DisplayMember = "Manga";
参考编号:https://learn.microsoft.com/en-us/dotnet/api/system.windows.forms.listcontrol.displaymember?view=netframework-4.8
答案:我删除了display漫画类中的整个openfiledialog,重命名了comic类中的封装,并完成了:D,现在openfiledialogy只打开一次,json中的值被正确地解析到漫画列表中,从而使我能够随心所欲地使用它们,谢谢,你把我推向了正确的方向,让我学会了调试:D。现在剩下的就是学习如何通过从列表框中选择不同的行来创建对象,另一个挑战正在等待这位新人。