关于Winform项目中DataGridView控件绑定list对象的坑

devtools/2024/10/16 2:23:03/

今天在使用DataGridView控件(以下简称Dgv)的时候,出现了"索引 -1 没有值。"的错误信息。

场景:我给Dgv绑定的数据源是一个List<MyClass>类型的集合,我new()完就直接给Dgv绑定了,然后在后面根据我的业务逻辑再去填充这个list,然后给Dgv刷新数据源。思路是这样没什么大问题,但是我在给这个list放入几个对象以后,也能在Dgv上展示出来,但是只要我点击Dgv行的时候,就会报错"索引 -1 没有值。",如下图。

其实从图中我们也可以看出来,物料明细Dgv其实是有数据的。包括我调了它的DataSource,count属性是2。但是就是点击行的时候会报错。

于是经过反复调试和分析,最终定位到了错误原因给Dgv绑定的数据源如果是List<T>列表时,如果首次绑定的这个list数量为0,那么就算后面list里有了对象,也只能在Dgv上作展示用,因为一点击行就会报错。这或许是Winform平台的一个bug?

所以这种奇奇怪怪的问题排查起来相当费劲,但是发现问题以后就好解决了。

以下提供三种解决方法

给Dgv绑定数据源时,判断如果list里对象数量为0,就不给Dgv赋值。这种方式简单暴力,改动最小。

使用BindingSource给这个list包一层再绑定到Dgv。这样有一个问题就是编辑Dgv的单元格时,无法直接映射到我们的list对象中。

③  最理想的方式,是用BindingList<T>对象代替Ilist<T>对象作为Dgv的数据源,既可彻底解决此问题,而且能实现Dgv修改时自动映射到list对象中(类似于MVVM)。如果是项目初期,可以考虑这种方式。


http://www.ppmy.cn/devtools/42662.html

相关文章

Flutter 中的 Material 小部件:全面指南

Flutter 中的 Material 小部件&#xff1a;全面指南 Flutter 的 Material 组件库提供了一套丰富的 UI 组件&#xff0c;用于构建遵循 Material Design 指南的应用。Material Design 是 Google 推出的一个设计语言&#xff0c;它旨在为 Android、Web、iOS 等多个平台提供统一的…

微服务架构下Docker容器技术与Kubernetes(K8S)

Kubernetes、微服务和Docker容器技术的结合提供了一个强大、灵活且高效的平台&#xff0c;能够应对现代应用程序的复杂性和动态性。Kubernetes的自动化管理、服务发现、负载均衡和配置管理&#xff0c;与Docker的标准化打包和运行环境相结合&#xff0c;最大化地发挥了微服务架…

ROS2进阶 -- 硬件篇问题(一) ESP32连接电脑后端口不显示,arduino ide端口灰色

自己的esp32用数据线连接电脑后&#xff0c;在Arduino ide中端口为灰色&#xff0c;而且在设备管理器中也找不到对应的端口设置。 这是因为新的ESP32需要安装驱动 解决方法 情况一&#xff1a;检查esp32连接电脑的数据线&#xff0c;如果是单纯的供电线是不可以的&#xff0c…

BGP实验:联邦和发射器实验

BGP实验&#xff1a;联邦和发射器实验 一、实验拓扑 二、实验要求及分析 实验要求&#xff1a; 1、AS1存在两个环回&#xff0c;一个地址为192.168.1.0/24&#xff0c;该地址不能再任何协议中宣告&#xff1b; ​ AS3存在两个环回&#xff0c;一个地址为192.168.2.0/24&…

大厂程序员离职,开发一个盲盒小程序2万,一周开发完!

大家好&#xff0c;我是程序员小孟&#xff01; 前面接了一个盲盒的小程序&#xff0c;主要的还是商城&#xff0c;盲盒的话只是其中的有一个活动。 现在的年轻人是真的会玩&#xff0c;越来越新的东西出来&#xff0c;越来越好玩的东西流行。 就像最近很火的地摊盲盒。 讲…

了解CentOS及其基础

什么是CentOS&#xff1f; CentOS&#xff08;Community ENTerprise Operating System&#xff09;是一个社区支持的操作系统&#xff0c;基于Red Hat Enterprise Linux&#xff08;RHEL&#xff09;的源代码。它是免费且开源的&#xff0c;广泛用于服务器环境。 为什么选择C…

第一份工资

当我拿到我人生的第一份工资时&#xff0c;那是一种难以言表的激动。我记得那个下午&#xff0c;阳光透过窗户洒在了我的办公桌上&#xff0c;我看着那张支票&#xff0c;心中满是欣喜和自豪。那是我独立生活的开始&#xff0c;也是我对自己能力的一种肯定。 我记得我是如何支配…

【Unity2D:C#Script】实现角色射击功能

一、创建子弹预制体 1. 创建子弹预制体 2. 调整图片大小、层级 二、为子弹添加碰撞体积 1. 添加Box Collider 2D、Rigidbody 2D组件 2. 锁定z轴 三、编辑敌人脚本 注&#xff1a;在以下代码中&#xff0c;只显示本章节新增的代码&#xff0c;省略原有的代码 1. 为敌人添加生…