You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

新增数据调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 16:09:11