DatagridView 添加与删除行

简介:
Rows cannot be programmatically added to the DataGridView's rows

当控件被数据绑定时,无法以编程方式向 DataGridView 的行集合中添加行。
 
关于这个问题的解决方法,网上只有以 dataTable / dataSet 做为数据源的解决办法。
一是,不绑定。二是,在 dataTable 上用 AddNew 。第三种是新插入一行,在绑定。
 
我现在是以 LINQ 为数据源来绑定 dataGridView 的。不绑定的话,要写很多代码,第三种没有测试,看描述,应该也是很麻烦。我想采取第二种,但是 LINQ 的结果不能直接转换成 DataTable 或 DataSet (请参见:http://msdn.microsoft.com/en-us/vbasic/bb688086.aspx)
 
一开始想用 BindingSource ,但是给BindingSource设完DataSource 之后,忘了给DataGridView 设定 DataSource 了,看不到结果,误以为用 BindingSource 不行。
 
搜不到解决办法,真的有点绝望的感觉。最后索性在试一把 BindingSource ,这下没有忘记给 DataGridView 设置 DataSource:
 
        private void SetGd2(int catID,string catName){
            gd2DefaultCatID = catID;
            gd2DefaultCatName = catName;
 
            gd2Bs = new BindingSource();
            gd2Bs.DataSource = dc.QV_Supplier_Category_Map.Where(m => m.CategoryID == catID);
            gd2.DataSource = gd2Bs;
        }
 
        private void gd2_DefaultValuesNeeded(object sender , DataGridViewRowEventArgs e) {
            e.Row.Cells["CategoryName"].Value = gd2DefaultCatName;
            e.Row.Cells["CategoryID"].Value = gd2DefaultCatID;
        }
 
        private void gd1_CellDoubleClick(object sender , DataGridViewCellEventArgs e) {
             QV_Supplier_Category_Map newRow = (QV_Supplier_Category_Map)gd2Bs.AddNew();
            newRow.CategoryID = gd2DefaultCatID;
            newRow.SupplierCategory = gd1.Rows[e.RowIndex].Cells["CategoryName"].Value.ToString();
            newRow.SupplierID = (int)gd1.Rows[e.RowIndex].Cells["SupplierID"].Value;
            gd2.CurrentRow.Cells["CategoryName"].Value = gd2DefaultCatName;
            gd2.CurrentRow.Cells["SupplierName"].Value = (string)gd1.Rows[e.RowIndex].Cells["SupplierName"].Value;
        }
 
可以以程序方式新增行了!但是却有另外一个问题, 用这种方法给 DataGridView 添加新行,DataGridView 的 DefaultValuesNeeded 这个事件没有触发。。。









本文转自 h2appy  51CTO博客,原文链接:http://blog.51cto.com/h2appy/289948,如需转载请自行联系原作者
目录
相关文章
如何将DataGridView中的滚动条显示出来
1、选项设置   DataGridView有一个ScrollBars,可以设置水平滚动条,垂直滚动条,或者两种包含。   2、实际运行效果
4577 0
|
6月前
|
设计模式 算法 安全
一文带你通俗理解23种软件设计模式(推荐收藏,适合小白学习,附带C++例程完整源码)
一文带你通俗理解23种软件设计模式(推荐收藏,适合小白学习,附带C++例程完整源码)
114 0
C#编程-72:dataGridView删除行
C#编程-72:dataGridView删除行
279 0
|
Java 应用服务中间件
WebLogic Server 10.3.6.0 更改jdk版本
WebLogic Server 10.3.6.0 更改jdk版本
3659 0
|
5月前
|
自然语言处理 C语言 数据格式
转义字符(Escape character)
转义字符(Escape character)
68 0
|
8月前
内网穿透报错 Invalid Host header
内网穿透报错 Invalid Host header
179 0
|
9月前
|
XML 存储 JSON
.Net Core基础之读取配置文件
.Net Core基础之读取配置文件
107 0
|
10月前
|
缓存 程序员 内存技术
STM32定时器配置(TIM1-TIM8)高级定时器+普通定时器,定时计数模式下总结
STM32定时器配置(TIM1-TIM8)高级定时器+普通定时器,定时计数模式下总结
462 0
STM32学习笔记(3) TIM基本定时器
代码中有这样一条,有人会问函数TIM_ClearFlag()和函数TIM_ClearITPendingBit()有什么区别?其实重点在Flag和IT,前者是外设的状态标志,而后者是外设的中断标志。状态标志就是一个外设它有自身的一些标志位(Flag),来表明它处于什么状态,下图就是定时器的状态标记。中断标志就是使能外设的中断后,每次发生一次中断,它会表明发生了什么样的中断,同样中断也有相应的标记。两者分别靠函数TIM_GetFlagStatus()和函数TIM_GetITStatus()来获取
246 0
|
关系型数据库 MySQL 数据库
MySQL配置用户权限(mysql5.*及mysql8.*+)
MySQL配置用户权限(mysql5.*及mysql8.*+)
178 0