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

DataGridView中接口类型单元格无值显示问题求助

问题解决方案

问题原因

当Item类中的Service属性改为接口类型IService后,DataGridView默认的属性绑定机制无法自动识别接口实现类的ToString()重写逻辑,导致单元格不显示内容;而鼠标悬停时能看到值,是因为悬停提示直接读取了对象的ToString()结果。

解决方法

方法1:新增计算属性直接暴露服务名称

在Item类中添加返回服务名称的计算属性,让DataGridView绑定该属性:

public class Item 
{
    public int ID { get; set; }
    public IService Service { get; set; }
    public int Quantity { get; set; }
    // 新增计算属性,直接返回服务名称
    public string ServiceName => Service?.Name ?? string.Empty;
}

之后可通过两种方式配置DataGridView:

  • 手动修改现有列的DataPropertyName为ServiceName
  • 移除原Service列,添加绑定ServiceName的新列

方法2:通过CellFormatting事件手动格式化单元格

给DataGridView绑定CellFormatting事件,在事件中手动设置单元格显示值:

// 假设Service列的列名为"Service"
dgv.CellFormatting += (sender, e) =>
{
    if (e.ColumnIndex == dgv.Columns["Service"].Index && e.Value is IService service)
    {
        e.Value = service.Name; // 若实现类重写了ToString,也可使用service.ToString()
        e.FormattingApplied = true; // 标记已完成格式化,跳过默认处理逻辑
    }
};

方法3:给接口添加默认ToString实现(C# 8.0+)

若项目使用C# 8.0及以上版本,可在IService接口中添加默认ToString实现,确保所有实现类都能返回名称:

public interface IService 
{
    string Name { get; set; }
    // 接口默认方法,统一返回Name属性
    public override string ToString() => Name;
}

注意:如果实现类自身重写了ToString,会优先使用实现类的版本。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 23:54:57