grdview_RowDeleting DataItem является нулем - PullRequest
0 голосов
/ 21 мая 2011

Я привязал свою сетку данных к списку.Я следую шаблону репозитория и использую EF v4.1.Мне нужно удалить Entity on row_deleting.Это код:

    protected void grdBooks_RowDeleting(object sender, System.Web.UI.WebControls.GridViewDeleteEventArgs e)
    {
        int bookId = (int)e.Keys[0];
        //grdBooks.Rows[e.RowIndex] //this item's dataItem is always null.
    }

Поскольку я работаю с сущностями, мне нужен фактический сущность, чтобы передать его в мой GenericRepository, который удалит эту сущность.Я получил bookId, но я не хочу делать глупости, например, извлекать Entity из базы данных, используя этот bookId, а затем передавать его моему методу удаления.Почему DataItem всегда нулевой и что я могу сделать, чтобы вернуть мою сущность?

Заранее спасибо:)

Ответы [ 3 ]

2 голосов
/ 21 мая 2011

DataItem = null, потому что когда вы привязываете данные к сетке, только один раз в Page_Load

public void Page_Load()
{
    if (!Page.IsPostBack)
    {
        grid.DataSource = GetDataSource();
        grid.DataBind();
    }
}

данные хранятся в Viewstate. После того, как Вы нажмете удалить, Вы отправляете обратно на сервер. Данные все еще присутствуют в состоянии просмотра Gridview и не восстановлены.

Вы можете удалить объект, если у вас есть Id. Вы можете сделать это 3 разными способами

  1. http://blogs.msdn.com/b/alexj/archive/2009/03/27/tip-9-deleting-an-object-without-retrieving-it.aspx

  2. вызовите context.ExecuteStoreCommand и просто выполните обычное DELETE FROM - http://msdn.microsoft.com/en-us/library/ee358769.aspx (2-й пример)

  3. создать хранимую процедуру в базе данных, импортировать ее в модель и вызвать ее с помощью context.ExecuteFunction ()

1 голос
/ 21 мая 2011

Вам не нужно ничего извлекать, чтобы удалить это.Просто создайте сущность с указанным идентификатором, присоедините ее и затем вызовите удаление.

Person user = new Person() { PersonId = Id };
db.Persons.Attach(person);
db.Persons.Remove(person);
db.SaveChanges();
0 голосов
/ 21 мая 2011

Я не уверен, правильно ли я понял ваш вопрос, но я думаю, что вы должны попробовать это

grdBooks.Rows[e.RowIndex].Cells[index].Text; 
...