You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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>

问题分析与解决方案

核心问题

  1. 错误使用Attach方法:db.Employees.Attach(data)是将已存在的实体附加到上下文,不会将新创建的空实体添加到数据库集合中,因此后续查询不到这条记录,绑定的GridView里也不会有这条空行。
  2. 设置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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 19:16:04