使用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文本。
- DropDownList的
修正后的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
相关产品推荐
相关产品推荐

