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

如何通过单选按钮将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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 10:33:17