我正在尝试从一个文件加载名称并将其添加到列表框中
我要加载的代码:
if (File.Exists(file))
{
List<Purchaser> Purchasers = JsonConvert.DeserializeObject<List<Purchaser>>(File.ReadAllText(file));
Purchaser purchaser = new Purchaser();
listDOF.Items.Add(purchaser.Name);
}
但这给了我一个例外,说价值不能为空
进行测试将Name值应用于一个标签而不是像label1.Text = purchaser.Name这样的列表框,让标签为空!所以,我认为文件没有加载或我做错了。
对于List类,我有:
public class Purchaser
{
public string Name { get; set; }
public bool Paid { get; set; }
}
List<Purchaser> Purchasers = new List<Purchaser>();
文件按我的意愿保存,但这不会将Name值加载到列表框中 有人可以帮我一把吗?我想在一整天都这样做!谢谢!
答案 0 :(得分:1)
new Purchaser().Name
始终为null 1 ,因此Items.Add(null)
throws an exception。
要修复此错误,使用 JSON信息 - 无需创建新的未初始化的购买者。例如,
var json = File.ReadAllText(file);
var purchasers = JsonConvert.DeserializeObject<List<Purchaser>>(json);
// for each purchaser, add them to the list
for (var p in purchasers) {
listDOF.Items.Add(p.Name ?? "{null}");
}
如上所述,ListBox.ObjectCollection.Add
不接受空值。虽然主要问题是通过使用JSON注释中的信息来修复null-coalescing operator (??)的额外用法。如果有人真的错过了一个名字(不要与空白名称混淆),使用这个防护可以防止异常 - 这不应该发生,但要防守!
1 Null是引用类型的默认值,包括字符串;由于(Name)属性尚未分配任何其他值,因此它仍然是默认值 - 或null。
答案 1 :(得分:1)
试试这个。
if (File.Exists(file))
{
var purchasers = JsonConvert.DeserializeObject<IEnumerable<Purchaser>>(File.ReadAllText(file));
foreach(var purchaser in purchasers)
{
if(string.IsNullOrWhitespace(purchaser.Name))
{
//nulls are not allowed
continue;
}
listDOF.Items.Add(purchaser.Name);
}
}
当您执行此操作时Purchaser purchaser = new Purchaser();
创建一个没有默认值以外的数据的新单个实例。