如何在Entity Framework中添加可编辑空行并绑定至GridView?
如何在GridView中添加可编辑的空行?
我尝试通过以下步骤实现向GridView添加可编辑的空行:向Entity Framework数据表中添加一条空记录,将数据源绑定至GridView控件,然后设置这条新记录的索引为编辑状态。但目前EditIndex值已正确设置,却没有出现可供编辑的空行。
原后台VB代码
Private Const ID_INDEX As Int32 = 1, NAME_INDEX As Int32 = 2, PHONE_INDEX As Int32 = 3, FAX_INDEX As Int32 = 4, EMAIL_INDEX As Int32 = 5, ENABL_INDEX As Int32 = 6 Protected Sub AddNew_Clicked(sender As Object, e As EventArgs) Handles lbAddNew.Click Dim data As New Employee() Using db As New DataClassesDataContext() db.Employees.Attach(data) ' db.Employees.AddObject(data) gridView1.DataSource = db.Employees gridView1.DataBind() Dim result As IQueryable(Of Employee) = From x As Employee In db.Employees Where x.emp_id = data.emp_id If (result IsNot Nothing) Then Dim added As Employee = result.FirstOrDefault() For index As Int32 = 0 To gridView1.Rows.Count - 1 Dim cells As TableCellCollection = gridView1.Rows(index).Cells Dim emp_id As Int32 = CInt(cells(ID_INDEX).Text) If (data.emp_id = emp_id) Then gridView1.EditIndex = index End If Next End If End Using End Sub
GridView控件代码
<asp:LinkButton ID="lbAddNew" runat="server" OnClientClick="AddNew_Clicked">Add New</asp:LinkButton><br /> <asp:GridView ID="gridView1" runat="server" HorizontalAlign="Left" AutoGenerateColumns="False" AllowDeleting="True" AllowEditing="True" BorderStyle="Solid" PageSize="30" OnRowCancelingEdit="gv_RowCancelEdit" OnRowEditing="gv_RowEditing" OnRowUpdating="gv_RowUpdating" OnRowDataBound="gv_RowDataBound" DataKeyNames="emp_id"> <Columns> <asp:CommandField ShowEditButton="True" ShowDeleteButton="true" /> <asp:BoundField DataField="emp_id" HeaderText="ID" InsertVisible="false" ReadOnly="true" SortExpression="emp_id" /> <asp:BoundField DataField="emp_name" HeaderText="Name" SortExpression="emp_name" /> <asp:BoundField DataField="emp_phone" HeaderText="Phone" SortExpression="emp_phone" /> <asp:BoundField DataField="emp_fax" HeaderText="Fax" SortExpression="emp_fax" /> <asp:BoundField DataField="emp_email" HeaderText="Email" SortExpression="emp_email" /> <asp:BoundField DataField="enabled" HeaderText="Enabled" SortExpression="enabled" /> </Columns> </asp:GridView>
问题分析与解决方案
核心问题
- 错误使用Attach方法:
db.Employees.Attach(data)是将已存在的实体附加到上下文,不会将新创建的空实体添加到数据库集合中,因此后续查询不到这条记录,绑定的GridView里也不会有这条空行。 - 设置EditIndex后未重新绑定:即使找到了记录,设置
gridView1.EditIndex = index后没有再次执行DataBind(),GridView不会刷新为编辑状态。
修正后的代码
Private Const ID_INDEX As Int32 = 1, NAME_INDEX As Int32 = 2, PHONE_INDEX As Int32 = 3, FAX_INDEX As Int32 = 4, EMAIL_INDEX As Int32 = 5, ENABL_INDEX As Int32 = 6 Protected Sub AddNew_Clicked(sender As Object, e As EventArgs) Handles lbAddNew.Click Dim data As New Employee() ' 给必填字段设置默认值,避免数据库约束报错 data.enabled = False Using db As New DataClassesDataContext() ' 替换Attach为AddObject,将新实体加入上下文 db.Employees.AddObject(data) ' 保存更改,确保新实体获得自增的emp_id db.SaveChanges() ' 绑定数据源 gridView1.DataSource = db.Employees gridView1.DataBind() ' 找到新添加记录的索引 Dim targetIndex As Integer = -1 For index As Int32 = 0 To gridView1.Rows.Count - 1 Dim cells As TableCellCollection = gridView1.Rows(index).Cells Dim emp_id As Int32 = CInt(cells(ID_INDEX).Text) If data.emp_id = emp_id Then targetIndex = index Exit For End If Next ' 设置编辑索引并重新绑定,触发编辑状态 If targetIndex <> -1 Then gridView1.EditIndex = targetIndex gridView1.DataSource = db.Employees gridView1.DataBind() End If End Using End Sub
额外注意事项
- 如果
emp_id是自增主键,必须调用SaveChanges()才能让新实体获得生成的ID,否则无法匹配查询。 - 若数据库中有必填字段,需要在创建
Employee实例时设置默认值,避免保存时报错。 - 可以优化索引查找逻辑,比如直接从绑定的数据源集合中定位新实体的位置,避免遍历GridView行。
内容的提问来源于stack exchange,提问作者jp2code
相关产品推荐
相关产品推荐

