0

我有一个简单的应用程序,其中有一个包含数据库中作者姓名的列表框(出于该项目的目的,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'.

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

4

2 回答 2

1

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

尝试使用列表框的选定值成员,或通过在列表框的 DataRowView 内对关联的 DataRow 调用 delete。我不确定 delete 是否真的会更新表或只是标记要删除的行,因此您可能必须在完成后调用数据表/已删除行的更新。

于 2013-04-23T23:01:31.597 回答
1

显然:中的对象listBox1.SelectedItem是类型:System.Data.DataRowView所以你根本不能这样做:

(MyDataSet.BookRow)listBox1.SelectedItem;

好消息是 Delete 或 Remove 方法适用于基类DataRowDataTable因此您实际上不需要在BookRow类型级别工作。

每个都DataRowView包含一个称为Row返回关联的成员DataRow,因此您可以将该行用作您的行并直接从那里或从父级删除它DataTable

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

((System.Data.DataRowView)listBox1.SelectedItem).Row.Delete();
于 2013-04-23T22:59:18.800 回答