使用Typed DataSet插入,更新,删除

时间:2013-04-23 22:52:03

标签: c# ado.net dataset typed-dataset

我有一个简单的应用程序,其中有一个列表框,其中包含数据库中作者的名称(出于本项目的目的,1作者= 1本书)。我必须为此应用程序使用类型化的DataSet。

当您选择其中一位作者时,旁边有三个文本框。一个显示所选作者的名称,另一个显示与他相关的书,最后一个显示发布日期。

在这张表格上,我有3个按钮。一个应该从数据库中删除所选行(在列表框中),一个应该更新所选行,一个应该插入一个新行。

我只是通过使用从数据源拖放到表单上来填充列表框和文本框,因此我的代码中唯一的行是:

this.BookTableAdapter.Fill(this.myDataSet.Book);

这当然是在加载时发生的。

我开始尝试实现删除功能并将其放在删除按钮的onClick事件上:

MyDataSet.BookRow selectedBook = (MyDataSet.BookRow)listBox1.SelectedItem;
selectedBook.Delete();

当我按下删除按钮时,它给出了以下异常:

System.InvalidCastException: Unable to cast object of type 'System.Data.DataRowView' to type 'BookRow'.

有谁能告诉我这里我做错了什么?

2 个答案:

答案 0 :(得分:1)

显然,listBox1.SelectedItem中的对象属于System.Data.DataRowView类型,因此您根本无法做到:

(MyDataSet.BookRow)listBox1.SelectedItem;

好消息是删除或删除方法适用于基类DataRowDataTable,因此您不需要在BookRow类型级别工作。

每个DataRowView都包含一个名为Row的成员,该成员会向您返回关联的DataRow,因此您可以将其用作行并直接从那里或从父{{1}中删除1}}。

我没有编译代码所以不能确切地说,但只是尝试以下并调整它,如果不完全构建:

DataTable

答案 1 :(得分:1)

列表框包含一个DataRowView,它包含绑定到它的数据。问题是这行MyDataSet.BookRow selectedBook =(MyDataSet.BookRow)listBox1.SelectedItem;您尝试将DataRowView强制转换为BookRow对象的位置。

尝试使用列表框的选定值成员或在列表框的DataRowView中的关联DataRow上调用delete。我不确定删除是否会实际更新表或只是标记一行以进行删除,因此您可能必须在完成后调用数据表/已删除行上的更新。