2013-04-23 2 views
0

У меня есть простое приложение, в котором есть список с именами авторов в базе данных (для целей этого проекта 1 автор = 1 книга). Я должен использовать типизированный DataSet для этого приложения.Вставить, обновить, удалить с помощью типизированного DataSet

Когда вы выбираете одного из авторов, в стороне есть три текстовых поля. Один показывает имя выбранного автора, другой показывает связанную с ним книгу, а последнюю - дату публикации.

На этой форме у меня есть 3 кнопки. Один из них должен удалить выбранную строку (в списке) из базы данных, предполагается, что она должна обновить выбранную строку, а одна должна вставить новую строку.

я заселил ListBox и текстовые поля только с помощью перетаскивания из источников данных на форме, единственная линия у меня есть в моем коде:

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'. 

Может ли кто-нибудь сказать мне, что я делаю неправильно здесь?

ответ

1

ясно объект: listBox1.SelectedItem имеет тип: System.Data.DataRowView так что вы просто не можете сделать:

(MyDataSet.BookRow)listBox1.SelectedItem; 

хорошая новость заключается в том, что Удалять или удаление методов работы с базовым классом DataRow и DataTable, так что вы не действительно необходимо работать на уровне BookRow.

каждый DataRowView содержит элемент под названием , который возвращает вам соответствующий DataRow, так что вы можете использовать этот один, как ваш ряд и удалить его прямо оттуда или из родительского DataTable.

Я не компиляции кода поэтому не могу точно сказать, но просто попробуйте следующее и настроить его, если не строить полностью:

((System.Data.DataRowView)listBox1.SelectedItem).Row.Delete(); 
+0

Это должно работать, если вы хотите строго типизированный datarow (не очень, хотя!): Var selectedBook = (MyDataSet.BookRow) ((System.Data.DataRowView) listBox1.SelectedItem) .Row; – Shiv

1

Окно списка содержит DataRowView, где хранятся данные, связанные с ней. Проблема заключается в этой строке MyDataSet.BookRow selectedBook = (MyDataSet.BookRow) listBox1.SelectedItem; Где вы пытаетесь применить DataRowView к объекту BookRow.

Попробуйте использовать выбранный элемент значения в списке или вызовите delete в соответствующем DataRow в DataRowView из списка. Я не уверен, что удаление будет фактически обновлять таблицу или просто пометить строку для удаления, поэтому вам, возможно, придется вызывать обновление в datatable/the deleted row, когда вы закончите.

Смежные вопросы