移除DataSet中的DataTable引发Invalid Cast Exception异常
解决强类型DataSet替换排序表时的InvalidCastException问题
问题原因
强类型DataSet(如ResultsDs)中的表是继承自DataTable的自定义子类(例如OBSSettlementPriceDataTable、BrokerSettlementPriceDataTable),而DefaultView.ToTable()生成的是普通DataTable实例。直接移除原强类型表并添加普通DataTable,会导致后续代码(如DataGridView绑定逻辑)尝试将表转换为对应强类型时触发类型转换异常。
方案一:复用原强类型表(推荐)
无需移除/添加表,直接清空原表数据,将排序后的数据导入原强类型表实例,保留类型一致性:
// 处理OBSSettlementPrice表 var obsSortedView = resultsDs.OBSSettlementPrice.DefaultView; obsSortedView.Sort = "排序字段1 ASC"; // 替换为你的排序规则 resultsDs.OBSSettlementPrice.Clear(); foreach (DataRowView rowView in obsSortedView) { resultsDs.OBSSettlementPrice.ImportRow(rowView.Row); } // 处理BrokerSettlementPrice表 var brokerSortedView = resultsDs.BrokerSettlementPrice.DefaultView; brokerSortedView.Sort = "排序字段2 DESC"; // 替换为你的排序规则 resultsDs.BrokerSettlementPrice.Clear(); foreach (DataRowView rowView in brokerSortedView) { resultsDs.BrokerSettlementPrice.ImportRow(rowView.Row); }
方案二:创建强类型表实例替换原表
若必须替换表,需创建对应强类型的表实例,而非普通DataTable:
// 处理BrokerSettlementPrice表 var brokerView = resultsDs.BrokerSettlementPrice.DefaultView; brokerView.Sort = "你的排序规则"; // 创建强类型表实例 var sortedBrokerTable = new ResultsDs.BrokerSettlementPriceDataTable(); // 导入排序后的行数据 foreach (DataRowView rowView in brokerView) { sortedBrokerTable.ImportRow(rowView.Row); } // 移除原强类型表(直接用实例避免类型混淆) resultsDs.Tables.Remove(resultsDs.BrokerSettlementPrice); // 添加新的强类型表 resultsDs.Tables.Add(sortedBrokerTable);
注意:移除表时直接使用强类型表实例(如
resultsDs.BrokerSettlementPrice),而非通过表名称从Tables集合中获取,避免类型匹配错误。
内容的提问来源于stack exchange,提问作者Mark Roworth
相关产品推荐
相关产品推荐

