数据库行不通过GridView更新更新

时间:2012-08-31 15:11:33

标签: c# gridview .net-3.5 asp.net-3.5

我有一个GridView,它具有以下属性:

OnRowUpdating="GridViewRowUpdateEventHandler"

在GridView中,我有以下控件:

<asp:TemplateField HeaderText="Progress" SortExpression="progress">
    <ItemTemplate>
        <asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="true">
            <asp:ListItem Value="0">Incomplete</asp:ListItem>
            <asp:ListItem Value="1">Complete</asp:ListItem>
        </asp:DropDownList>
    </ItemTemplate>
</asp:TemplateField> 

GridViewRowUpdateEventHandler看起来像这样:

protected void GridViewRowUpdateEventHandler(object sender, GridViewUpdateEventArgs e)
{
    SqlConnection connection;
    SqlCommand command;

    GridViewRow row = (GridViewRow)GridView1.Rows[e.RowIndex];

    DropDownList ddlPriority = (DropDownList)row.FindControl("DropDownList1");

    using (connection = new SqlConnection(ConfigurationManager.AppSettings["connString"]))
    {
        using (command = new SqlCommand(@"update table1 set priority = @priority where id = @id", connection))
        {
            command.Parameters.Add("@priority", SqlDbType.Int, 1).Value = ddlPriority.SelectedValue;
            command.Parameters.Add("@id", SqlDbType.Int, 1).Value = row.RowIndex;

            connection.Open();
            command.ExecuteNonQuery();
            connection.Close();
        }
    }

    GridView1.DataBind();
}

我根本没有收到错误消息,并且数据库中的相关行没有更新。谁知道为什么?

可能是因为我正在查看错误的单元格Cells[5]吗?或者也许是因为我在page_load中什么都没有?或者别的什么?

4 个答案:

答案 0 :(得分:1)

由于DropDiownList位于TemplateFieldNamingContainer是GridViewRow,因此您应该使用row.FindControl来获取引用:

DropDownList ddlPriority = (DropDownList)row.FindControl("DropDownList1");

而不是

DropDownList ddlPriority = (DropDownList)row.Cells[5].FindControl("DropDownList1");

但这不是问题的核心,因为row.Cells[5].FindControl在第6个单元格中也可能起作用。否则你会得到NullreferenceException

我假设您还在回发上绑定了GridView,您应该检查IsPostBack属性:

protected void Page_Load()
{
    if (!IsPostBack)
    {
        BindGrid();
    }
}

除此之外:

command.Parameters.Add("@id", SqlDbType.Int, 1).Value = row;

不起作用,因为row是GridViewRow。你最后也应该DataBind你的GridView,否则不会反映出这些变化。

答案 1 :(得分:1)

您在GridViewRowUpdateEventHandler的末尾添加DataBind

GridView.DataBind();

为了找到控制

var ddlPriority = (DropDownList)row.FindControl("DropDownList1");

答案 2 :(得分:1)

我认为您已忘记重新绑定 gridView数据

gridview1.DataSource = YOUR_DATASOURCE;
gridview1.DataBind();

此外,您应该通过

访问dropDownList
DropDownList ddlPriority = (DropDownList) row.FindControl("DropDownList1");

修改

发现了另一个错误

command.Parameters.Add("@id", SqlDbType.Int, 1).Value = row; // wrong! primaryKey value needed!

这不起作用,因为行是GridViewRow类型。您应该指定我假设的primaryKey值!

无论您决定先做什么,我都会添加一些Debug.WriteLine(..)语句,以查看将哪些值发送到SQL Server。

答案 3 :(得分:1)

我认为问题在于您使用行的rowIndex作为ID。所以你最后的sql命令就是这样的

update table1 set priority = 'blah' where id = 0 //(where its the first row and so on)

所以这是一个非常好的查询,它将运行没有错误或异常,但没有ID = 0.您将它绑定到错误的ID。你需要绑定它,是表中的ID。

您可以通过运行SQL事件探查器来仔细检查这一点,并且您应该能够找到发送到数据库的查询。