我有一个简单的应用程序,其中有一个列表框,其中包含数据库中作者的名称(出于本项目的目的,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'.
有谁能告诉我这里我做错了什么?
答案 0 :(得分:1)
显然,listBox1.SelectedItem
中的对象属于System.Data.DataRowView
类型,因此您根本无法做到:
(MyDataSet.BookRow)listBox1.SelectedItem;
好消息是删除或删除方法适用于基类DataRow
和DataTable
,因此您不需要在BookRow
类型级别工作。
每个DataRowView
都包含一个名为Row
的成员,该成员会向您返回关联的DataRow
,因此您可以将其用作行并直接从那里或从父{{1}中删除1}}。
我没有编译代码所以不能确切地说,但只是尝试以下并调整它,如果不完全构建:
DataTable
答案 1 :(得分:1)
列表框包含一个DataRowView,它包含绑定到它的数据。问题是这行MyDataSet.BookRow selectedBook =(MyDataSet.BookRow)listBox1.SelectedItem;您尝试将DataRowView强制转换为BookRow对象的位置。
尝试使用列表框的选定值成员或在列表框的DataRowView中的关联DataRow上调用delete。我不确定删除是否会实际更新表或只是标记一行以进行删除,因此您可能必须在完成后调用数据表/已删除行上的更新。