grdview_RowDeleting DataItem为Null

时间:2011-05-21 13:05:05

标签: c# asp.net entity-framework gridview aspxgridview

我已将datagrid绑定到列表中。我遵循Repository模式并使用EF v4.1。我需要删除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.
    }

当我使用Entities时,我需要实际的Entity将它传递给我的GenericRepository,它将删除该实体。我确实得到了bookId,但是我不想做傻事,比如使用这个bookId从数据库中获取Entity,然后将它传递给我的delete方法。为什么DataItem总是为null,我该怎么办才能找回我的实体?

提前致谢:)

3 个答案:

答案 0 :(得分:2)

DataItem = null,因为当您在Page_Load

中仅将数据数据绑定到gridview一次时
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(第二个示例)

  3. 在数据库上创建存储过程,将其导入模型并使用context.ExecuteFunction()

  4. 调用它。

答案 1 :(得分:1)

您无需提取任何内容即可将其删除。只需使用指定的Id创建实体,将其附加,然后调用Remove。

Person user = new Person() { PersonId = Id };
db.Persons.Attach(person);
db.Persons.Remove(person);
db.SaveChanges();

答案 2 :(得分:0)

我不确定我是否理解你的问题,但我认为你应该尝试这个

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