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

C# WinForms绑定Firebase数据到DataGridView显示空行

问题根源

ConvertTo<InitialPayment>() 转换后所有属性返回null,是Firestore字段名和C#实体属性映射不匹配导致的。Google.Cloud.Firestore 库默认按[FirestoreProperty]标记的名称做精确匹配(大小写、拼写完全一致才会赋值),不会自动适配不同命名风格。
大部分场景下是Firestore文档用了小驼峰(如purchaseOrder)或下划线命名(如purchase_order),但C#实体用了帕斯卡命名(首字母大写的PurchaseOrder),两边名称对不上,所以所有属性都读不到值,最终DataGridView只显示空行。

修复方案

方案1:显式指定属性对应的Firestore字段名(最稳妥,适配所有命名风格)

直接在[FirestoreProperty]特性里传入文档中实际的字段名,修改实体类如下:

using System;
using Google.Cloud.Firestore;

namespace FYP_Desktop
{
    [FirestoreData]
    public class InitialPayment
    {
        // 括号内替换为你Firestore文档中实际的字段名即可
        [FirestoreProperty("purchaseOrder")]
        public string PurchaseOrder { get; set; }
        [FirestoreProperty("purchaseAmount")]
        public string PurchaseAmount { get; set; }
        [FirestoreProperty("packingDepartment")]
        public string PackingDepartment { get; set; }
        [FirestoreProperty("customerStatus")]
        public string CustomerStatus { get; set; }
        [FirestoreProperty("paymentPercentile")]
        public string PaymentPercentile { get; set; }
    }
}

如果你的Firestore字段是下划线风格,比如purchase_order,把对应特性里的字符串替换成实际字段名就行。

方案2:全局配置命名规则自动转换(适合字段命名风格统一的场景)

如果你的Firestore全库都是统一的小驼峰命名,可以在初始化FirestoreDb时注册命名转换规则,不用给每个属性手动写字段名:

using Google.Cloud.Firestore;
using Google.Cloud.Firestore.Converters;

var db = new FirestoreDbBuilder
{
    ProjectId = "你的Firebase项目ID",
    ConverterRegistry = new ConverterRegistry { new CamelCaseNamingConvention() }
}.Build();

配置后,库会自动把C#的帕斯卡命名属性转成小驼峰,去匹配Firestore的字段。

额外注意事项
  • 先验证原始字段名:调试时点开DocumentSnapshot实例的非公开成员,找到存储原始文档数据的字典,确认每个字段的实际键名,保证和映射配置完全一致,注意大小写、特殊字符、拼写差异。
  • 修复跨线程UI操作问题:Listen的回调默认不在UI线程执行,直接操作DataGridView会触发跨线程异常,也是导致界面不显示数据的常见原因,需要把UI更新逻辑调度到UI线程执行,修改监听代码如下:
CollectionReference coll = conn.db.Collection("payments");
FirestoreChangeListener listener = coll.Listen(
    snapshot =>
    {
        // 回调线程先做数据转换,不要直接操作UI控件
        var payments = new List<InitialPayment>();
        foreach (DocumentSnapshot doc in snapshot.Documents)
        {
            payments.Add(doc.ConvertTo<InitialPayment>());
        }
        // 切到UI线程更新控件
        dgvPayments.Invoke(new Action(() =>
        {
            dgvPayments.Rows.Clear();
            foreach (var payment in payments)
            {
                dgvPayments.Rows.Add(
                    payment.PurchaseOrder, 
                    payment.PurchaseAmount, 
                    payment.PackingDepartment,
                    payment.CustomerStatus, 
                    payment.PaymentPercentile
                );
            }
        }));
    }
);

内容的提问来源于stack exchange,提问作者mkz

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 16:54:21