如何通过单选按钮将DataGridView行转移至另一仅含DataGridView的窗体
实现DataGridView行数据跨窗体转移(基于SQL Server)
针对你的需求,这里给出一套直接可落地的实现方案,核心是通过数据库事务完成数据迁移,再同步刷新两个窗体的DataGridView:
一、基础准备
- 确认两个窗体的DataGridView已正确绑定各自的数据库表(推荐用
SqlDataAdapter+DataSet实现数据加载与显示) - 在源窗体添加单选按钮(用于触发转移操作),如果需要每行对应一个单选按钮,可以给DataGridView添加
DataGridViewRadioButtonColumn列
二、核心实现步骤
1. 获取选中行
如果设置了整行选中模式(dataGridView1.SelectionMode = DataGridViewSelectionMode.FullRowSelect),直接通过SelectedRows集合获取选中行即可;如果是每行带单选按钮的列,需要遍历DataGridView的行,找到单选按钮被选中的那一行。
2. 数据库层面的迁移操作
因为两个窗体对应不同的数据库表,要做从源表删除该行 + 插入到目标表的原子操作,必须用事务保证这两个步骤要么都成功,要么都失败,避免数据不一致。
3. 同步刷新界面
操作完成后,重新加载两个窗体的DataGridView数据,确保界面显示最新的表数据。
三、代码示例
假设源窗体为SourceForm,对应表SourceTable;目标窗体为TargetForm,对应表TargetTable,两表列结构完全一致。
源窗体中单选按钮的点击事件
private void radioBtnTransfer_Click(object sender, EventArgs e) { // 检查是否选中行 if (dataGridView1.SelectedRows.Count == 0) { MessageBox.Show("请先选择要转移的行"); return; } DataGridViewRow selectedRow = dataGridView1.SelectedRows[0]; // 替换成你的SQL Server连接字符串,建议放在App.config中 string connStr = "Server=你的服务器名;Database=你的库名;Integrated Security=True;"; using (SqlConnection conn = new SqlConnection(connStr)) { conn.Open(); SqlTransaction tran = conn.BeginTransaction(); try { // 1. 插入数据到目标表 // 推荐明确写出列名,避免表结构变更出问题 string insertSql = @"INSERT INTO TargetTable (ID, Column1, Column2, Column3) SELECT ID, Column1, Column2, Column3 FROM SourceTable WHERE ID = @RowID"; SqlCommand insertCmd = new SqlCommand(insertSql, conn, tran); insertCmd.Parameters.AddWithValue("@RowID", selectedRow.Cells["ID"].Value); // ID为主键 insertCmd.ExecuteNonQuery(); // 2. 从源表删除数据 string deleteSql = "DELETE FROM SourceTable WHERE ID = @RowID"; SqlCommand deleteCmd = new SqlCommand(deleteSql, conn, tran); deleteCmd.Parameters.AddWithValue("@RowID", selectedRow.Cells["ID"].Value); deleteCmd.ExecuteNonQuery(); // 提交事务 tran.Commit(); MessageBox.Show("数据转移成功"); // 刷新源窗体数据 LoadSourceGridData(); // 刷新已打开的目标窗体数据 foreach (Form openForm in Application.OpenForms) { if (openForm is TargetForm targetForm) { targetForm.LoadTargetGridData(); break; } } } catch (Exception ex) { tran.Rollback(); MessageBox.Show($"转移失败:{ex.Message}"); } } }
窗体加载数据的通用方法
// 源窗体加载数据 private void LoadSourceGridData() { string connStr = "你的连接字符串"; string query = "SELECT * FROM SourceTable"; SqlDataAdapter adapter = new SqlDataAdapter(query, connStr); DataTable dt = new DataTable(); adapter.Fill(dt); dataGridView1.DataSource = dt; } // 目标窗体加载数据(放在TargetForm中) public void LoadTargetGridData() { string connStr = "你的连接字符串"; string query = "SELECT * FROM TargetTable"; SqlDataAdapter adapter = new SqlDataAdapter(query, connStr); DataTable dt = new DataTable(); adapter.Fill(dt); dataGridView2.DataSource = dt; }
四、注意事项
- 不要用
SELECT *进行插入,尽量明确指定列名,防止后续表结构调整导致数据插入错位 - 连接字符串不要硬编码,右键项目→添加→新建项→应用程序配置文件,在
connectionStrings节点配置,通过ConfigurationManager读取 - 如果是每行带单选按钮的列,获取选中行的逻辑示例:
DataGridViewRow selectedRow = null; foreach (DataGridViewRow row in dataGridView1.Rows) { RadioButton rb = row.Cells["RadioButtonColumn"].Value as RadioButton; if (rb != null && rb.Checked) { selectedRow = row; break; } } if (selectedRow == null) { MessageBox.Show("请选择要转移的行"); return; }
内容的提问来源于stack exchange,提问作者Mon Msw
相关产品推荐
相关产品推荐

