C# DataGridView 自动给新增记录当前单元格赋值
写给百度知道某网友提的问题:如何将一个datagridview中选中的单元格值赋给另一个datagridview选中的单元格?
赋值操作是相当简单的:
C# Code:
if (dataGridView1.SelectedCells.Count > 0)
{
if (dataGridView2.SelectedCells.Count > 0)
{
dataGridView2.SelectedCells[0].Value = dataGridView1.SelectedCells[0].Value;
}
}
if (dataGridView1.SelectedCells.Count > 0)
{
if (dataGridView2.SelectedCells.Count > 0)
{
dataGridView2.SelectedCells[0].Value = dataGridView1.SelectedCells[0].Value;
}
}
但是有种情况下赋值会失败,假设当前记录是新增状态时赋值后移动焦点再移回来,单元格的值消失了,是因为新增的记录没有保存到数据源中,要处理这种情况必须手工新增记录追加到数据源中。
C# Code:
private void Form1_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.Columns.Add("Code", typeof(string));
dt.Columns.Add("Name", typeof(string));
dt.Rows.Add(new object[] { "V2.2", "C/S开发框架V2.2" });
dt.Rows.Add(new object[] { "V3.0", "C/S开发框架V3.2" });
dt.AcceptChanges();
dataGridView1.DataSource = dt;
DataTable dt2 = dt.Copy();
dataGridView2.DataSource = dt2;
}
private void Form1_Load(object sender, EventArgs e)
{
DataTable dt = new DataTable();
dt.Columns.Add("Code", typeof(string));
dt.Columns.Add("Name", typeof(string));
dt.Rows.Add(new object[] { "V2.2", "C/S开发框架V2.2" });
dt.Rows.Add(new object[] { "V3.0", "C/S开发框架V3.2" });
dt.AcceptChanges();
dataGridView1.DataSource = dt;
DataTable dt2 = dt.Copy();
dataGridView2.DataSource = dt2;
}
C# Code:
private void button1_Click(object sender, EventArgs e)
{
//
//程序说明:将表格2当前单元格的值赋给表格一当前单元格。
//
//两个表格都要选择单元格
if ((dataGridView1.SelectedCells.Count > 0) && (dataGridView2.SelectedCells.Count > 0))
{
DataGridViewRow R = dataGridView1.SelectedCells[0].OwningRow;//当前行
DataTable dt = (dataGridView1.DataSource as DataTable);//表格一的数据源
//如R.IsNewRow属性=True,表示是自动新增的行,此时R.DataBoundItem==Null
//DataBoundItem属性对应的是DataRow或者某个对象,这时不能够直接给空行赋值
//如果表格处于新增状态,必须新增一条记录给源据源赋值。
if (R.IsNewRow)
{
DataRow newRow = dt.Rows.Add();//增加一条新记录
//将现有的数值赋值给DataRow
foreach (DataGridViewCell cell in R.Cells)
{
newRow[cell.OwningColumn.DataPropertyName] = cell.Value;
}
int columnIndex = dataGridView1.SelectedCells[0].ColumnIndex;
string FieldName = dataGridView1.Columns[columnIndex].DataPropertyName;
//将表格2单元格的值赋给表格一中新增的记录
newRow[FieldName] = dataGridView2.SelectedCells[0].Value;
//重新定位行和列
dataGridView1.CurrentCell = dataGridView1.CurrentCell = dataGridView1.Rows[dt.Rows.Count - 1].Cells[columnIndex];
dataGridView1.CurrentCell.Selected = true;
}
else //非新增的记录,赋值相当简单
{
dataGridView1.SelectedCells[0].Value = dataGridView2.SelectedCells[0].Value;
}
}
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898
private void button1_Click(object sender, EventArgs e)
{
//
//程序说明:将表格2当前单元格的值赋给表格一当前单元格。
//
//两个表格都要选择单元格
if ((dataGridView1.SelectedCells.Count > 0) && (dataGridView2.SelectedCells.Count > 0))
{
DataGridViewRow R = dataGridView1.SelectedCells[0].OwningRow;//当前行
DataTable dt = (dataGridView1.DataSource as DataTable);//表格一的数据源
//如R.IsNewRow属性=True,表示是自动新增的行,此时R.DataBoundItem==Null
//DataBoundItem属性对应的是DataRow或者某个对象,这时不能够直接给空行赋值
//如果表格处于新增状态,必须新增一条记录给源据源赋值。
if (R.IsNewRow)
{
DataRow newRow = dt.Rows.Add();//增加一条新记录
//将现有的数值赋值给DataRow
foreach (DataGridViewCell cell in R.Cells)
{
newRow[cell.OwningColumn.DataPropertyName] = cell.Value;
}
int columnIndex = dataGridView1.SelectedCells[0].ColumnIndex;
string FieldName = dataGridView1.Columns[columnIndex].DataPropertyName;
//将表格2单元格的值赋给表格一中新增的记录
newRow[FieldName] = dataGridView2.SelectedCells[0].Value;
//重新定位行和列
dataGridView1.CurrentCell = dataGridView1.CurrentCell = dataGridView1.Rows[dt.Rows.Count - 1].Cells[columnIndex];
dataGridView1.CurrentCell.Selected = true;
}
else //非新增的记录,赋值相当简单
{
dataGridView1.SelectedCells[0].Value = dataGridView2.SelectedCells[0].Value;
}
}
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898
参考文档:
C# DataGridView定位记录,设置焦点行
DataGridView绑定List 对象,偶尔出现索引 |1 没有值|C/S开发框架
C# DataGridView 隐藏默认 * 行|C/S开发框架
C# DataGridView组件自动添加弹出菜单(ContextMenuStrip)复制单元格的值
C# Winform DataGridView设置选定的区域为不可编辑
[转帖]C#如何实现DataGridView到DataGridView的拖拽
使用.NET8/EFCore访问达梦数据库|C/S框架网|C/S开发框架
达梦数据库.NETCore.NET8实践指南|C/S软件开发框架|C/S开发框架
EntityFramework入门:配置DbContext以及增、删、改、查、事务操作
测试CSFramework.DB数据底层组件IDatabase.GetTop方法(Mssql/MySql)
CSFramework.DB多数据底层类库测试程序(测试报告-2021)
Winform调用WebApi接口实现增删改查CRUD实例源码
C/S客户端Winform窗体调用WebApi接口(C# 实例)
C#.Net组件开发(高级篇) - 自定义CollectionEditor编辑器
架构C#WebService程序
C#转换IList对象数组为byte数组.然后通过WebService传递
C# DataGridView定位记录,设置焦点行
DataGridView绑定List 对象,偶尔出现索引 |1 没有值|C/S开发框架
C# DataGridView 隐藏默认 * 行|C/S开发框架
C# DataGridView组件自动添加弹出菜单(ContextMenuStrip)复制单元格的值
C# Winform DataGridView设置选定的区域为不可编辑
[转帖]C#如何实现DataGridView到DataGridView的拖拽
使用.NET8/EFCore访问达梦数据库|C/S框架网|C/S开发框架
达梦数据库.NETCore.NET8实践指南|C/S软件开发框架|C/S开发框架
EntityFramework入门:配置DbContext以及增、删、改、查、事务操作
测试CSFramework.DB数据底层组件IDatabase.GetTop方法(Mssql/MySql)
CSFramework.DB多数据底层类库测试程序(测试报告-2021)
Winform调用WebApi接口实现增删改查CRUD实例源码
C/S客户端Winform窗体调用WebApi接口(C# 实例)
C#.Net组件开发(高级篇) - 自定义CollectionEditor编辑器
架构C#WebService程序
C#转换IList对象数组为byte数组.然后通过WebService传递
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
