C# 在asp.net中更新数据到gridview

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/12075882/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-09 20:16:39  来源:igfitidea点击:

updating data into gridview in asp.net

c#asp.netgridview

提问by Prashanth

I am relatively new to asp.net.So please bear with me if my query is childish my grid design:

我对asp.net比较陌生。所以如果我的查询很幼稚,我的网格设计请多多包涵:

<asp:GridView runat ="server"  GridLines = "Both" DataKeyNames="book_id"AutoGenerateColumns ="false" CellPadding ="5" CellSpacing ="5" allowpaging="True" allowsorting="True"
 ID="gv_table1" EmptyDataText ="No data exists"       OnRowEditing="gv_RowEditing"
OnRowCancelingEdit="gv_RowCancelingEdit" OnRowUpdating="gv_RowUpdating" OnRowDeleting="gv_RowDeleting">
    <Columns>

<asp:BoundField HeaderText="Book ID"  DataField="book_id">

</asp:BoundField>



<asp:BoundField DataField="book_name"   HeaderText="Book Name">

</asp:BoundField>
<asp:BoundField DataField="author_name" HeaderText="Author Name">

</asp:BoundField>
<asp:BoundField DataField="publisher" HeaderText="Publisher">

</asp:BoundField>
<asp:BoundField DataField="year_edition" HeaderText="Year/Edition">

</asp:BoundField>
<asp:BoundField DataField="total_no" HeaderText="Total No">

</asp:BoundField>
<asp:BoundField DataField="available" HeaderText="Available">

</asp:BoundField>
<asp:BoundField DataField="tags" HeaderText="Tags">

</asp:BoundField>
<asp:BoundField DataField="fare" HeaderText="Fare">

</asp:BoundField>
<asp:BoundField DataField="state" HeaderText="State">

</asp:BoundField>
 <asp:templatefield HeaderText ="Options">
                                <itemtemplate >

                                        <asp:linkbutton id="btnEdit" runat="server" commandname="Edit" text="Edit" />

                                        <asp:linkbutton id="btnDelete" runat="server" commandname="Delete" text="Delete" />
                                </itemtemplate>
                                <edititemtemplate>
                                        <asp:linkbutton id="btnUpdate" runat="server" commandname="Update" text="Update" />
                                        <asp:linkbutton id="btnCancel" runat="server" commandname="Cancel" text="Cancel" />
                                </edititemtemplate>
                        </asp:templatefield>





</Columns>
</asp:GridView>

my code behind:

我背后的代码:

public void gv_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {

        int bookid = Convert.ToInt32(gv_table1.DataKeys[e.RowIndex].Values["book_id"].ToString());
        string bookname =(gv_table1.Rows[e.NewValues].Cells[1].Controls[0] as TextBox).Text;
        string bookname = (gv_table1.Rows[e.RowIndex].FindControl("author_name") as TextBox).Text;

        string book = gv_table1.Rows[e.RowIndex].Cells[1].Text ;
}

I am able to delete but not edit data.I am not able to get the changed values that i enter in the grid view .My best effort got me the value that was in gridview before editing or changing. Thanks in advance friends.

我可以删除但不能编辑数据。我无法获得我在网格视图中输入的更改值。我的最大努力让我在编辑或更改之前获得了 gridview 中的值。在此先感谢朋友。

采纳答案by Waqar Janjua

I don't think we can access bound field using Find control method. author_nameis the name of datafield inside the bound feild you can't access it using FindControl, it is not a control.

我不认为我们可以使用 Find 控件方法访问绑定字段。author_name是绑定字段内数据字段的名称,您无法使用 FindControl 访问它,它不是控件。

Use the e.RowIndex to get the updated values.

使用 e.RowIndex 获取更新的值。

public void gv_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    string bookname = ((TextBox)(gv_table1.Rows[e.RowIndex].Cells[1].Controls[0])).Text;

                         // OR
    string bookname =(gv_table1.Rows[e.RowIndex].Cells[1].Controls[0] as TextBox).Text;
    gv_table1.EditIndex = -1;  // reset the edit index
    // Again Bind the gridview to show updated data
}

Updated Answer:

更新答案:

Problem:The problem is that you are binding your gridview on each post back

问题:The problem is that you are binding your gridview on each post back

Solution:

解决方案:

To test it,I create a gridview add two column, and I got old values if I bind gridview on each postback. To avoid from it just add the Page.IsPostBackcheck in your before binding the grid.

为了测试它,我创建了一个 gridview,添加了两列,如果我在每次回发时绑定 gridview,我就会得到旧值。为了避免它,只需Page.IsPostBack在绑定网格之前添加检查。

protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack) // If you not place this check then you will get the old values because GridView in Bind on every postback
    {
        BindGrid(); // Bind you grid here
    }
}

My Complete code:

我的完整代码:

// Aspx Code
<asp:GridView ID="GridView1" AutoGenerateColumns="false" runat="server" 
    AllowPaging="True" 
     onrowediting="GridView1_RowEditing" onrowupdating="GridView1_RowUpdating" onrowcancelingedit="GridView1_RowCancelingEdit" 
    >        
    <Columns>
        <asp:BoundField DataField="Name" HeaderText="Name" />
        <asp:BoundField DataField="City" HeaderText="Name" />
        <asp:CommandField ShowEditButton ="true" ShowCancelButton="true"  ShowDeleteButton="true" />
    </Columns>
</asp:GridView>

// Aspx Code Behind
protected void Page_Load(object sender, EventArgs e)
{
    if (!Page.IsPostBack) // If you not place this check then you will get the old values because GridView in Bind on every postback
    {
        BindGrid();
    }
}
private void BindGrid() // function for binding gridview
{
    DataTable dt = new DataTable();
    dt.Columns.Add("Name");
    dt.Columns.Add("City");

    DataRow r = dt.NewRow();
    r[0] = "Name 1";
    r[1] = "City 1";

    DataRow r1 = dt.NewRow();
    r1[0] = "Name 2";
    r1[1] = "City 2";

    dt.Rows.Add(r);
    dt.Rows.Add(r1);

    GridView1.DataSource = dt;
    GridView1.DataBind();
}


protected void GridView1_RowEditing(object sender, GridViewEditEventArgs e)
{
    GridView1.EditIndex = e.NewEditIndex; // setting new index
    BindGrid();
}


protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    GridViewRow row = GridView1.Rows[e.RowIndex];
    string newvalue = ((TextBox)row.Cells[0].Controls[0]).Text;
     GridView1.EditIndex = -1; // Again reset
}

protected void GridView1_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
{
    GridView1.EditIndex = -1; // reseting grid view
    BindGrid();
}

回答by javasocute

I wrote out all the code for you even though you probably dont need some of it. Hopefully you can learn from it and apply to yours. But this code does work. But first, if I were you, I would create an Item Template for book id and make it a label. Then that will be your control. You also need to use parameters to prevent sql injection. There are so many ways to do this, but this is just how I do it. Hopefully it will help.

我为你写了所有的代码,即使你可能不需要其中的一些。希望你能从中吸取教训并应用到你的身上。但是这段代码确实有效。但首先,如果我是你,我会为书籍 ID 创建一个项目模板并将其作为标签。那么这将是你的控制。您还需要使用参数来防止 sql 注入。有很多方法可以做到这一点,但这只是我的方法。希望它会有所帮助。

 protected void GridView1_RowUpdating(object sender, GridViewUpdateEventArgs e)
{
    //Identify your control i.e. the primary key (lblbookid is the name of the item template)
    GridViewRow row = GridView1.Rows[e.RowIndex];
    Label bookidLabel = (Label)row.FindControl("lblbookid");

    //connect to db which you probably already have
    string strSQLConnection = ("server=blah;database=blah;uid=blah;pwd=blah");
    SqlConnection sqlConnection = new SqlConnection(strSQLConnection);

    SqlCommand cmd = new SqlCommand();

    cmd.CommandText = "UPDATE yourtable SET book_name = @book_name WHERE book_id = @book_id";

    //parameters
    cmd.Parameters.Add("@bookid", SqlDbType.Char).Value = bookidLabel.Text;
    cmd.Parameters.Add("@book_name", SqlDbType.Char).Value = ((TextBox)GridView1.Rows[e.RowIndex].Cells[2].Controls[0]).Text;
    cmd.Parameters.Add("@book_author", SqlDbType.Char).Value = ((TextBox)GridView1.Rows[e.RowIndex].Cells[3].Controls[0]).Text;

    cmd.Connection = sqlConnection;
    sqlConnection.Open();
    cmd.ExecuteNonQuery();



    sqlConnection.Close();

    GridView1.EditIndex = -1;
    BindData();
}

回答by Satinder singh

Instead of boundfiled, I prefer to use TemplateFieldcoz of its simplicity.

而不是boundfiled,我更喜欢使用TemplateField它的简单性。

Tested Sample code :Add new record from footer and Update the selected row

测试示例代码:从页脚添加新记录并更新所选行

Default.aspx:

默认.aspx:

    <asp:GridView ID="gvstatus" runat="server" AutoGenerateColumns="False" 
             CellPadding="4" ForeColor="#333333" GridLines="None" 
            onrowcancelingedit="gvstatus_RowCancelingEdit" 
            onrowediting="gvstatus_RowEditing" onrowupdating="gvstatus_RowUpdating" 
            onselectedindexchanged="gvstatus_SelectedIndexChanged" ShowFooter="True" 
            onrowcommand="gvstatus_RowCommand" Width="600px" AllowPaging="True" 
            onpageindexchanging="gvstatus_PageIndexChanging">
            <Columns>

 <asp:TemplateField HeaderText="SrNo " HeaderStyle-HorizontalAlign="Left">
            <ItemTemplate>
                    <%# Container.DataItemIndex + 1 %>
                </ItemTemplate>
 </asp:TemplateField>

 <asp:TemplateField HeaderText="ID" Visible="false">
      <ItemTemplate>
      <asp:Label ID="lblid" runat="server" Text='<%# Bind("columnname_id") %>'> </asp:Label>
     </ItemTemplate>
</asp:TemplateField>


<asp:TemplateField HeaderText="EmpName">
      <ItemTemplate>
        <asp:Label ID="lblEmpName" runat="server" Text='<%# Bind("columnname_EmpName") %>'></asp:Label>
       </ItemTemplate>
       <EditItemTemplate>
           <asp:TextBox ID="txtEmpName" runat="server"  Text='<%# Bind("columnname_EmpName") %>'></asp:TextBox>
        </EditItemTemplate>
        <FooterTemplate>
              <asp:TextBox ID="txtfEmpName"  runat="server"></asp:TextBox>
        </FooterTemplate>
</asp:TemplateField>

 <asp:TemplateField HeaderText="empSalary" >
        <ItemTemplate>
           <asp:Label ID="lblempSalary" runat="server" Text='<%# Bind("columnname_EmpSalary") %>'></asp:Label>
        </ItemTemplate>
        <EditItemTemplate>
             <asp:TextBox ID="txtempSalary" runat="server"  Text='<%# Bind("columnname_EmpSalary") %>'></asp:TextBox>
         </EditItemTemplate>
         <FooterTemplate>
            <asp:TextBox ID="txtfempSalary" runat="server" ></asp:TextBox>
         </FooterTemplate>
</asp:TemplateField>

 <asp:TemplateField ShowHeader="False" ItemStyle-Width="190px">
         <ItemTemplate>
             <asp:Button ID="btnedit" runat="server" CausesValidation="False" 
                            CommandName="Edit" Text="Edit"></asp:Button>
          </ItemTemplate>
          <EditItemTemplate>
               <asp:Button ID="btnupdate" runat="server" CausesValidation="True" 
                            CommandName="Update" Text="Update"></asp:Button>
                        &nbsp;<asp:Button ID="btncancel" runat="server" CausesValidation="False" 
                            CommandName="Cancel" Text="Cancel"></asp:Button>
         </EditItemTemplate>
        <FooterTemplate>
            <asp:Button ID="btnadd" runat="server" Text="Add" CommandName="Add" />
        </FooterTemplate>
 </asp:TemplateField>
            </Columns>
            <PagerStyle BackColor="#A86E07" ForeColor="White" HorizontalAlign="Center" />
            <SelectedRowStyle BackColor="#E2DED6" Font-Bold="True" ForeColor="#333333" />
          <HeaderStyle BackColor="#A86E07" Font-Bold="True" ForeColor="White" />
        <EditRowStyle BackColor="#d9d9d9" />
    <AlternatingRowStyle BackColor="White" ForeColor="#A86E07" />
 </asp:GridView>

CodeBehind:

代码隐藏:

 protected void Page_Load(object sender, EventArgs e)
    {
       if (!Page.IsPostBack)
       {
         gvBind(); //Bind gridview 
       }
     }

public void gvBind()
{
    SqlDataAdapter dap = new SqlDataAdapter("select id, empName,empSalary from myTable", conn);
     DataSet ds = new DataSet();
     dap.Fill(ds);
     gvstatus.DataSource = ds.Tables[0];
     gvstatus.DataBind();
}


protected void gvstatus_RowUpdating(object sender, GridViewUpdateEventArgs e)
    {
        //Update the select row from girdview
        lblmsg.Text = "";
        try
        {
            GridViewRow row = (GridViewRow)gvstatus.Rows[e.RowIndex];
            Label lblid = (Label)gvstatus.Rows[e.RowIndex].FindControl("lblid");
            TextBox txtname = (TextBox)gvstatus.Rows[e.RowIndex].FindControl("txtEmpName");
            TextBox txtSalary = (TextBox)gvstatus.Rows[e.RowIndex].FindControl("txtempSalary");
            string empName = txtname.Text;
            string empSalary = txtSalary.Text;
            string lblID=lblid.Text;
            int result = UpdateQuery(empName, empSalary,lblID);
            if (result > 0)
            {
                lblmsg.Text = "Record is updated successfully.";
            }
            gvstatus.EditIndex = -1;
            gvBind();
        }
        catch (Exception ae)
        {
            Response.Write(ae.Message);
        }

    }


protected void gvstatus_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
    {
        gvstatus.EditIndex = -1;
        gvBind();
    }
 protected void gvstatus_RowEditing(object sender, GridViewEditEventArgs e)
    {
        lblmsg.Text = "";
        gvstatus.EditIndex = e.NewEditIndex;
        gvBind();
    }

  protected void gvstatus_RowCommand(object sender, GridViewCommandEventArgs e)
    {
        //Add new record to database form girdview footer
        if (e.CommandName == "Add")
        {
            string empName = ((TextBox)gvstatus.FooterRow.FindControl("txtfempName")).Text;
            string empSalry = ((TextBox)gvstatus.FooterRow.FindControl("txtfempSalary")).Text;
            int result = InsertNewRecord(empName, empSalry);
            if (result > 0)
            {
                lblmsg.Text = "Record is added successfully.";
            }
            gvstatus.EditIndex = -1;
            gvBind();

        }
    }


    public void UpdateQuery(string empName, string empSalary, string lblID)
    {
        SqlCommand cmd = new SqlCommand("update myTable set empName='" + empName + "',empSalary='" + empSalary + "' where  id='" + lblID + "'", conn);
        conn.Open();
        int temp = cmd.ExecuteNonQuery();
        conn.Close();
        return temp;
    }


public void InsertNewRecord(string empName, string empSalary)
    {
        SqlCommand cmd = new SqlCommand("your insert query ", conn);
        conn.Open();
        int temp = cmd.ExecuteNonQuery();
        conn.Close();
        return temp;
    }

http://satindersinght.blogspot.in/2012/08/how-to-addupdate-record-using-gridview.html

http://satindersinght.blogspot.in/2012/08/how-to-addupdate-record-using-gridview.html

Mark answer if you find it helpfull :)

如果您觉得有帮助,请标记答案:)