新增数据调用ListerPF()报空引用错误 列表记录不显示
问题根因
两个异常的触发原因非常明确:
- 空引用报错直接原因:你定义的
ListerPF方法要求必须传入DB_ListeNF类型的datareceived参数,但在OnAppearing生命周期中调用时写的是无参调用ListerPF(),运行时会默认传入null作为参数值,方法内部第一行就访问datareceived.Numero,对null对象取属性直接触发空引用异常。 - 新增记录不显示原因:一方面
ListerPF调用触发异常后会走catch逻辑返回空列表,列表控件自然没有数据;另一方面你跳转PostesNF页面时没有传递当前新增记录对应的费用单号,就算方法不报错,也没有正确的筛选条件去匹配刚插入的记录。
另外你的表单提交逻辑还有潜在运行时风险:Picker_TypeFrais.SelectedItem可能为null、几个数值输入框的内容可能不符合格式要求,直接调用ToString()、double.Parse()/int.Parse()也会触发异常。
修复方案
按以下步骤调整代码即可解决问题:
1. 调整PostesNF页面,支持接收待查询的费用单号
给PostesNF页面增加私有字段存储传入的单号,修改构造函数接收参数:
// PostesNF.xaml.cs 类内新增字段、修改构造函数 private string _targetNumero; public PostesNF(string numeroNF) { InitializeComponent(); _targetNumero = numeroNF; }
如果存在其他不需要筛选单号、直接展示全部记录的入口,可以额外加一个无参构造函数兼容:
// 兼容无参跳转的场景 public PostesNF() { InitializeComponent(); _targetNumero = string.Empty; }
2. 调整表单提交后的跳转逻辑,传入当前新增的单号
修改表单提交后的跳转代码,把当前新增记录用的单号传给PostesNF页面:
// 调用AddNewPF完成后,修改跳转代码 await App.methode.AddNewPF(Label_NumeroNF.Text, DatePicker_Date.Date, Editor_LibelleNF.Text, Picker_TypeFrais.SelectedItem.ToString(), double.Parse(Entry_Quantite.Text), double.Parse(Entry_Tarif.Text), double.Parse(Entry_Montant.Text), double.Parse(Entry_MontantTotal.Text), CheckBox_CCEntreprise.IsChecked, int.Parse(Entry_Imputation.Text)); // 传入当前单号跳转 Navigation.PushAsync(new PostesNF(Label_NumeroNF.Text));
3. 重构ListerPF方法,修复参数不匹配问题
把原来要求传入整个DB_ListeNF对象的逻辑改成直接接收单号字符串,减少空引用风险,同时增加参数校验:
/// <summary> /// 查询指定单号对应的费用记录,单号为空时返回全部记录 /// </summary> public async Task<List<DB_PosteNF>> ListerPF(string numero = null) { try { if (string.IsNullOrWhiteSpace(numero)) { return await connection.Table<DB_PosteNF>().ToListAsync(); } return await connection.Table<DB_PosteNF>().Where(x => x.Numero == numero).ToListAsync(); } catch (Exception ex) { StatutMessage = $"Impossible d'afficher la liste des postes de frais. \nErreur : {ex.Message}"; } return new List<DB_PosteNF>(); }
4. 修改OnAppearing中的数据加载逻辑
调用ListerPF时传入之前存储的目标单号:
protected override async void OnAppearing() { base.OnAppearing(); CollectionViewPF.ItemsSource = await App.methode.ListerPF(_targetNumero); }
5. 增加表单提交前的输入校验,避免潜在异常
在调用AddNewPF前先校验输入合法性,替换原来直接取值、Parse的逻辑:
// 校验选择器、输入框内容 if (Picker_TypeFrais.SelectedItem == null) { StatutMessage = "Veuillez sélectionner un type de frais"; return; } if (!double.TryParse(Entry_Quantite.Text, out double quantite) || !double.TryParse(Entry_Tarif.Text, out double tarif) || !double.TryParse(Entry_Montant.Text, out double montant) || !double.TryParse(Entry_MontantTotal.Text, out double montantTotal) || !int.TryParse(Entry_Imputation.Text, out int imputation)) { StatutMessage = "Veuillez vérifier les valeurs numériques saisies"; return; } // 校验通过再执行插入、跳转逻辑 await App.methode.AddNewPF(Label_NumeroNF.Text, DatePicker_Date.Date, Editor_LibelleNF.Text, Picker_TypeFrais.SelectedItem.ToString(), quantite, tarif, montant, montantTotal, CheckBox_CCEntreprise.IsChecked, imputation); Navigation.PushAsync(new PostesNF(Label_NumeroNF.Text));
修复后效果
- 页面加载时不会再触发空引用异常:方法参数匹配,且做了空值校验,不存在null对象访问属性的场景
- 新增的费用记录可以正常展示:插入成功后跳转时传入了对应单号,查询时的筛选条件正确,能精准匹配刚插入的记录
- 减少了输入不合法、未选择选项导致的额外运行时报错
内容的提问来源于stack exchange,提问作者Olivia
相关产品推荐
相关产品推荐

