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

使用DropDownList和TextBox更新GridView行时遇非空字段报错问题

问题分析与解决思路

错误核心:更新操作时ID statusa字段未被正确赋值,导致NULL被传入不允许为空的数据库列。以下是具体排查和解决步骤:

1. 核对数据库字段与页面绑定的对应关系

错误提示的列是ID statusa,但你的ASPX代码中DropDownList绑定的是[Status]字段——这两个是完全不同的字段:

  • 如果ID statusa是状态表的外键ID(数值类型),Status只是状态的显示文本(字符串类型),那当前绑定逻辑完全错误:
    • DropDownList的Value应设置为对应ID statusa的数值(比如1、2、3),而非文本;
    • SelectedValue需绑定ID statusa字段,而非Status文本。

修正后的ASPX代码示例:

<asp:TemplateField HeaderText="Status" SortExpression="Status">
    <EditItemTemplate>
        <asp:DropDownList ID="ddlStatus" runat="server" SelectedValue='<%# Bind("[ID statusa]") %>'>
            <asp:ListItem Text="Neobrađeno" Value="1"></asp:ListItem>
            <asp:ListItem Text="U obradi" Value="2"></asp:ListItem>
            <asp:ListItem Text="Završeno" Value="3"></asp:ListItem>
        </asp:DropDownList>
    </EditItemTemplate>
    <ItemTemplate>
        <asp:Label ID="lblStatus" runat="server" Text='<%# Bind("[Status]") %>'></asp:Label>
    </ItemTemplate>
</asp:TemplateField>

(注意:Value值要和你数据库中ID statusa的实际数值对应)

2. 检查RowUpdating事件中的SQL参数传递

确保后续更新SQL语句中,把获取到的DropDownList值赋值给ID statusa列,而非Status列。示例代码:

Protected Sub GridView1_RowUpdating(sender As Object, e As GridViewUpdateEventArgs)
    Dim orderID As Integer = Integer.Parse(GridView1.DataKeys(e.RowIndex).Value.ToString())
    Dim deliveryDate As Date = Date.Parse(CType(GridView1.Rows(e.RowIndex).FindControl("txtDatumIsporuke"), TextBox).Text)
    Dim statusID As String = CType(GridView1.Rows(e.RowIndex).FindControl("ddlStatus"), DropDownList).SelectedValue

    ' 构建更新SQL
    Dim updateSql As String = "UPDATE Narudžba SET [ID statusa] = @StatusID, DatumIsporuke = @DeliveryDate WHERE ID = @OrderID"
    Using conn As New SqlConnection(YourConnectionString)
        Using cmd As New SqlCommand(updateSql, conn)
            cmd.Parameters.AddWithValue("@StatusID", statusID)
            cmd.Parameters.AddWithValue("@DeliveryDate", deliveryDate)
            cmd.Parameters.AddWithValue("@OrderID", orderID)
            conn.Open()
            cmd.ExecuteNonQuery()
        End Using
    End Using

    GridView1.EditIndex = -1
    GridView1.DataBind()
End Sub

3. 验证DropDownList选中值的获取是否正常

在RowUpdating事件中添加调试代码,确认获取到的选中值不为空:

Debug.WriteLine("Selected Status ID: " & statusID)

如果输出为空,检查控件ID是否拼写正确(ddlStatus),或行索引是否正确。

4. 确认GridView的DataKeys配置

确保GridView的DataKeys包含主键字段,避免主键获取错误:

<asp:GridView ID="GridView1" runat="server" DataKeyNames="ID" OnRowUpdating="GridView1_RowUpdating" ...>

内容的提问来源于stack exchange,提问作者meraki_1

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 16:35:03