Gridview行未更新 -

时间:2014-11-30 07:25:45

标签: c# asp.net .net gridview

我有一个Gridview,我有编辑选项来编辑Row。我编写了编辑和更新的代码,但它没有得到更新,行变为空白。我调试了代码,并没有知道确切的问题是什么。请查看您的参考代码,并告诉我具体问题: -

Gridview aspx代码:

<asp:GridView ID="grdPostData" runat="server" Width="100%" border="1" Style="border: 1px solid #E5E5E5;" CellPadding="3" AutoGenerateColumns="False"
        AllowPaging="true" PageSize="4" CssClass="hoverTable" OnPageIndexChanging="grdPostData_PageIndexChanging" OnRowDataBound="grdPostData_RowDataBound" 
    OnRowDeleting="grdPostData_RowDeleting" DataKeyNames="Id" OnRowEditing="grdPostData_RowEditing"  OnRowUpdating="grdPostData_RowUpdating"
        OnRowCancelingEdit="grdPostData_RowCancelingEdit"  >
    <AlternatingRowStyle BackColor="#CCCCCC" />
    <Columns>
        <asp:BoundField DataField="title" HeaderText="Title" ItemStyle-Width="30" ControlStyle-CssClass="k-grid td" />
        <asp:BoundField DataField="description" HeaderText="Description" ItemStyle-Width="30" ControlStyle-CssClass="k-grid td" />
        <asp:TemplateField HeaderText="Post Category" ItemStyle-Width="50">
            <ItemTemplate>
                <asp:DropDownList ID="ddlPostCategory" AppendDataBoundItems="true" runat="server"
                    AutoPostBack="false">
                    <%-- <asp:ListItem Text="Select" Value="0"></asp:ListItem>--%>
                </asp:DropDownList>
                    <asp:Label ID="lblId" runat="server" Text='<%# Eval("Id") %>' > </asp:Label>
            </ItemTemplate>
        </asp:TemplateField>
        <asp:BoundField DataField="active" HeaderText="Active" ItemStyle-Width="30" ControlStyle-CssClass="k-grid td" />
        <asp:TemplateField HeaderText="Action" HeaderStyle-Width="15%">
            <ItemTemplate>
                <asp:ImageButton ID="btnDelete" AlternateText="Delete" ImageUrl="~/images/delete.png" runat="server" Width="15" Height="15"  CausesValidation="false" OnClientClick="return confirm('Are you sure you want to delete this record?')" />
            </ItemTemplate>
        </asp:TemplateField>
        <asp:CommandField ButtonType="Image" ItemStyle-Width="15" EditImageUrl="~/images/edit.png" ShowEditButton="True" ControlStyle-Width="15" ControlStyle-Height="15" CancelImageUrl="~/images/close.png" UpdateImageUrl="~/images/update.png">
            <ControlStyle Height="20px" Width="20px"></ControlStyle>
        </asp:CommandField>
    </Columns>
</asp:GridView>

另见CS代码:

protected void grdPostData_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    bool IsUpdated = false;
    //getting key value, row id
    int Id = Convert.ToInt32(grdPostData.DataKeys[e.RowIndex].Value.ToString());

    //get all the row field detail here by replacing id's in FindControl("")..

    GridViewRow row = grdPostData.Rows[e.RowIndex];
    // DropDownList ddlPostlistcategory = ((DropDownList)(row.Cells[0].Controls[0]));
    TextBox txtPostTitle = ((TextBox)(row.Cells[0].Controls[0]));
    TextBox txtPostdesc = ((TextBox)(row.Cells[1].Controls[0]));
    TextBox ddlActive = ((TextBox)(row.Cells[2].Controls[0]));

    using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DefaultCSRConnection"].ConnectionString))
    {
        SqlCommand cmd = new SqlCommand();

        //cmd.CommandText = "UPDATE tbl_Pages SET page_title=@page_title,page_description=@page_description,meta_title=@meta_title,meta_keywords=@meta_keywords,meta_description=@meta_description,Active=@Active  WHERE Id=@Id";
        cmd.CommandText = "UPDATE tbl_Post SET title=@title, description=@description, active=@active WHERE Id=@Id";

        cmd.Parameters.AddWithValue("@Id", Id);
        cmd.Parameters.AddWithValue("@title", txtPostTitle.Text);
        cmd.Parameters.AddWithValue("@description", txtPostdesc.Text);
        cmd.Parameters.AddWithValue("@Active", Convert.ToInt32(ddlActiveInactive.SelectedValue));

        cmd.Connection = conn;
        conn.Open();
        IsUpdated = cmd.ExecuteNonQuery() > 0;
        conn.Close();
    }
    if (IsUpdated)
    {
        ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('page updated sucessfully');window.location ='csrposts.aspx';", true);
        BindGrid();
    }
    else
    {
        //Error while updating details

        grdPostData.EditIndex = -1;
        //bind gridview here..
        grdPostData.DataBind();
    }

}

protected void grdPostData_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
    grdPostData.EditIndex = -1;
    BindGrid();
}

编辑部分代码: -

protected void grdPostData_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        bool IsUpdated = false;
        int Id = Convert.ToInt32(grdPostData.DataKeys[e.RowIndex].Value.ToString());

        GridViewRow row = grdPostData.Rows[e.RowIndex];
        DropDownList ddlPostCategory = (DropDownList)row.FindControl("ddlPostCategory");
        //TextBox title = ((TextBox)(row.Cells[0].Controls[0]));
        //TextBox description = ((TextBox)(row.Cells[1].Controls[0]));
        TextBox title = (TextBox)row.FindControl("txtPostTitle");
        TextBox description = (TextBox)row.FindControl("txtPostdesc");
        DropDownList ddlActive = (DropDownList)row.FindControl("ddlActiveInactive");

        using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DefaultCSRConnection"].ConnectionString))
        {
            SqlCommand cmd = new SqlCommand();
            //cmd.CommandText = "UPDATE tbl_Pages SET page_title=@page_title,page_description=@page_description,meta_title=@meta_title,meta_keywords=@meta_keywords,meta_description=@meta_description,Active=@Active  WHERE Id=@Id";
            cmd.CommandText = "UPDATE tbl_post SET title=@title,description=@description,active=@active WHERE Id=@Id";

            cmd.Parameters.AddWithValue("@Id", Id);
            cmd.Parameters.AddWithValue("@title", txtPostTitle.Text);
            cmd.Parameters.AddWithValue("@description", txtPostdesc.Text);
            cmd.Parameters.AddWithValue("@active", Convert.ToInt32(ddlActiveInactive.SelectedValue));

            cmd.Connection = conn;
            conn.Open();
            IsUpdated = cmd.ExecuteNonQuery() > 0;
            conn.Close();
        }

        if (IsUpdated)
        {
            ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('page updated sucessfully');window.location ='csrposts.aspx';", true);
            BindGrid();
        }
        else
        {
            grdPostData.EditIndex = -1;
            grdPostData.DataBind();
        }
    }

2 个答案:

答案 0 :(得分:1)

代码完美只是小错误。 变化

TextBox ddlActive = ((TextBox)(row.Cells[2].Controls[0]));

TextBox ddlActive = ((TextBox)(row.Cells[3].Controls[0]));

您想设置第3个控件的Active值而不是第2个。

答案 1 :(得分:0)

如果您的控件位于TemplateField,那么您可以从行

中找到控件

对于DropDownList你需要尝试这样的事情:

DropDownList ddlPostCategory = (DropDownList)row.FindControl("ddlPostCategory") ;

以下行将生成错误

cmd.Parameters.AddWithValue("@Active", Convert.ToInt32(ddlActiveInactive.SelectedValue));

您需要从您缺少的网格中找到此控件ddlActiveInactive

不要使用AddWithValue,否则会产生意外结果 SOURCE

修改

protected void grdPostData_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    bool IsUpdated = false;
    //getting key value, row id
    int Id = Convert.ToInt32(grdPostData.DataKeys[e.RowIndex].Value.ToString());

    //get all the row field detail here by replacing id's in FindControl("")..

    GridViewRow row = grdPostData.Rows[e.RowIndex];
    DropDownList ddlPostCategory = (DropDownList)row.FindControl("ddlPostCategory") ;
    string PostTitle = row.Cells[0].Text;
    string Postdesc = row.Cells[1].Text;
    string Active = row.Cells[2].Text;

    using (SqlConnection conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["DefaultCSRConnection"].ConnectionString))
    {
        SqlCommand cmd = new SqlCommand();


        cmd.CommandText = "UPDATE tbl_Post SET title=@title, description=@description, active=@active WHERE Id=@Id";

        cmd.Parameters.Add("@Id",SqlDbType.Int).Value=Id;
        cmd.Parameters.Add("@title",SqlDbType.Varchar,100).Value=PostTitle ;
        cmd.Parameters.Add("@description",SqlDbType.Varchar,200).Value= Postdesc ;
        cmd.Parameters.Add("@Active",SqlDbType.Int).Value=Convert.ToInt32(Active);

        cmd.Connection = conn;
        conn.Open();
        IsUpdated = cmd.ExecuteNonQuery() > 0;
        conn.Close();
    }
    if (IsUpdated)
    {
        ScriptManager.RegisterStartupScript(this, this.GetType(), "alert", "alert('page updated sucessfully');window.location ='csrposts.aspx';", true);
        BindGrid();
    }
    else
    {
        //Error while updating details

        grdPostData.EditIndex = -1;
        //bind gridview here..
        //GET GDATA FROM DATABASE AND BIND TO GRID VIEW
    }

}