无法将DataTable中选中的所有行添加至DataSet的技术问题
问题分析与解决方案
看起来你在把DataGrid中选中的行保存到DataSet时,代码里漏掉了几个关键步骤,导致无法捕获所有选中记录。咱们来一步步修正这个问题:
核心问题点
你的现有代码只是循环找到了每行的CheckBox控件,但既没有判断控件是否被选中,也没有把选中行的数据添加到DataSet的DataTable里,而且DataRow的创建位置也不对(只创建了一次,无法复用给多个行)。
修正后的完整代码
public DataSet getMain() { // 获取带结构的空DataSet(假设GetSchemaRequest返回的是仅含表结构的DataSet) DataSet ds = CFObj.GetSchemaRequest(); DataTable targetTable = ds.Tables[0]; foreach (DataGridItem item in dgAvailableCandidates.Items) { // 找到当前行的选择CheckBox CheckBox saveChkBoxItem = item.FindControl("chkbox_Select") as CheckBox; // 先确认控件存在且被选中 if (saveChkBoxItem != null && saveChkBoxItem.Checked) { // 获取当前行绑定的原始数据(这里假设绑定的是DataRowView,根据你的实际绑定类型调整) DataRowView rowView = item.DataItem as DataRowView; if (rowView != null) { // 创建新行,复制选中行的所有数据 DataRow newRow = targetTable.NewRow(); newRow.ItemArray = rowView.Row.ItemArray; // 将新行添加到目标表中 targetTable.Rows.Add(newRow); } } } return ds; }
关键修正说明
- 选中状态判断:新增了
saveChkBoxItem.Checked的判断,只处理真正被选中的行,避免无效操作 - 循环优化:改用
foreach遍历DataGridItem,代码更简洁易读 - 正确创建DataRow:把DataRow的创建移到选中判断内部,每个选中行都生成独立的新行
- 数据复制:从DataGridItem的
DataItem中获取原始绑定数据,完整复制到新行里(如果不需要全列复制,可以单独指定列赋值,比如newRow["UserId"] = rowView.Row["UserId"]) - 添加到表中:最后一定要把新行添加到DataTable的Rows集合里,这样DataSet才会包含这些选中记录
如果你的DataGrid绑定的是自定义实体类(比如Candidate),只需要调整数据获取的部分:
// 假设绑定的是自定义Candidate类 Candidate selectedCandidate = item.DataItem as Candidate; if (selectedCandidate != null) { DataRow newRow = targetTable.NewRow(); newRow["CandidateId"] = selectedCandidate.Id; newRow["FullName"] = selectedCandidate.FullName; // 其他字段按需赋值 targetTable.Rows.Add(newRow); }
这样修改后,你的DataSet就会正确包含所有选中的记录,后续就可以正常将这些数据保存到数据库了。
内容的提问来源于stack exchange,提问作者Nikhil G
相关产品推荐
相关产品推荐

