我有一个winforms应用程序,它使用强类型自定义DataSet来保存数据以进行处理。它将填充数据库中的数据。
我有一个用户控件,它接受任何自定义数据集并在数据网格中显示内容。这用于测试和调试。为了使控件可重用,我将自定义数据集视为普通的System.Data.DataSet。
我扩展了控件以允许将数据集保存到XML文件中,并加载以前保存的XML文件。
我现在要做的是获取加载的数据文件,该文件被视为标准DataSet,并将其强制转换回自定义数据集。这应该不难,但我得到以下System.InvalidCastException消息:
无法将类型为“System.Data.DataSet”的对象强制转换为类型 'CostingDataSet'。
以下是问题代码的示例(它是生成异常的3的最后一行):
DataSet selected = debugDisplay.SelectedDataSet;
CostingDataSet tempDS = new CostingDataSet();
tempDS = (CostingDataSet)selected.Copy();
有谁能指导我如何解决这个问题?
修改 根据nEM的意见,我实施了这一切,一切都很好。
foreach (System.Data.DataTable basicDT in selected.Tables)
{
DataTable dt = tempDS.Tables[basicDT.TableName];
dt = basicDT.Copy();
}
此外,SSarma建议的代码也有效。
答案 0 :(得分:5)
根据我从this website收集的内容,您无法将常规数据集转换为有类型的数据集,因为它的类型很强且具有一定的规格。如果您将其保存为常规数据集,则在对其进行反序列化时,XML不会记录它作为类型化数据集创建的情况。对于xml文件,您只保存了常规数据集,因此它等同于尝试通过显式转换将标准数据集转换为类型化数据集,这是不允许的。
您可以创建一个populate方法,该方法将常规数据集作为参数,将所有数据复制到您键入的数据集中。
这假设您将其序列化为标准数据集。
答案 1 :(得分:4)
如何使用Streams(对不起代码未经过测试),但您明白了
DataSet selected = debugDisplay.SelectedDataSet;
string ds1 = selected.GetXml();
CostingDataSet tempDS = new CostingDataSet();
System.IO.MemoryStream ms = new System.IO.MemoryStream(ds1.Length);
selected.WriteXml(ms);
ms.Position = 0;
tempDS.ReadXml(ms);