VB.NET如何根据Datagridview1的勾选值填充另一个Datagridview2
实现方案
触发事件选择
优先使用DataGridView.CellContentClick事件,该事件仅在点击单元格内部内容时触发,完美匹配复选框点击的交互场景,避免了CellClick事件点击单元格空白区域也触发的无效触发问题。
如果不需要勾选后立刻同步,而是点击「确认」按钮后才更新DataGridView2,直接用按钮的Click事件即可。
完整代码示例(C# WinForm)
1. 事件绑定
可直接在窗体设计器中选中DataGridView1,在属性面板的事件列表中双击CellContentClick自动生成绑定,也可以在Form_Load事件中手动添加绑定:
private void Form1_Load(object sender, EventArgs e) { // 此处省略DataGridView1原有数据填充逻辑 dataGridView1.CellContentClick += DataGridView1_CellContentClick; }
2. 事件逻辑实现
private void DataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { // 先判断点击的是不是复选框列,此处替换为你自己的复选框列Name if (dataGridView1.Columns[e.ColumnIndex].Name != "CheckColumn") return; // 必须加这行,提交当前单元格的编辑状态,否则刚勾选的状态无法立即读取到 dataGridView1.CommitEdit(DataGridViewDataErrorContexts.Commit); // 筛选所有勾选的行,构造新的数据源 DataTable dt = new DataTable(); // 给dt添加和你需要展示在DataGridView2的列,示例: dt.Columns.Add("商品名称"); dt.Columns.Add("单价"); dt.Columns.Add("库存"); foreach (DataGridViewRow row in dataGridView1.Rows) { // 判断当前行复选框是否被勾选 bool isChecked = Convert.ToBoolean(row.Cells["CheckColumn"].Value); if (isChecked) { DataRow dr = dt.NewRow(); // 替换为你实际需要取的字段 dr["商品名称"] = row.Cells["ProductName"].Value.ToString(); dr["单价"] = row.Cells["Price"].Value.ToString(); dr["库存"] = row.Cells["Stock"].Value.ToString(); dt.Rows.Add(dr); } } // 绑定到DataGridView2 dataGridView2.DataSource = dt; }
注意事项
- 代码中的
CheckColumn需替换为你实际设置的复选框列的Name属性值,优先用Name匹配而不是列索引,避免后续新增列后索引错位导致代码失效 - 数据量较大的场景下,建议直接对DataGridView1的原始数据源做筛选,不用遍历UI行,性能更高
- 如果不需要实时同步,把遍历筛选的逻辑放到按钮Click事件中即可,不需要绑定CellContentClick事件
内容的提问来源于stack exchange,提问作者gurpreet
相关产品推荐
相关产品推荐

