【问题标题】:updating data into gridview in asp.net在asp.net中将数据更新到gridview中
【发布时间】:2012-08-22 14:54:39
【问题描述】:

我对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>

我的代码:

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 ;
}

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

【问题讨论】:

  • 最好的方法是将你的逻辑封装在try catch块中,然后开始在visual studio中调试你的项目,只有这样你才能解决问题
  • 检查我的更新答案我得到了解决方案。

标签: c# asp.net gridview


【解决方案1】:

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

使用 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
}

更新答案:

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

解决方案:

为了测试它,我创建了一个 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
    }
}

我的完整代码:

// 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();
}

【讨论】:

  • 不,我只得到未更改的值,即存储在 db 中的值,我没有得到输入的值。我只想获取输入的值,所以只有我可以将其更新到 db。请帮助我用那个。
  • 你有没有像这样更改行编辑事件中的编辑索引protected void gv_table1_RowEditing(object sender, GridViewEditEventArgs e) { //Set the edit index. gv_table1.EditIndex = e.NewEditIndex; // AGain call the bind method to rebind the gridview
  • 检查我更新的答案,我提到了问题并发布了解决方案。
【解决方案2】:

我更喜欢使用TemplateField 而不是boundfiled,因为它很简单。

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

Default.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>

代码隐藏:

 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

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

【讨论】:

    【解决方案3】:

    我为你写了所有的代码,即使你可能不需要其中的一些。希望你能从中学习并应用到你的身上。但是这段代码确实有效。但首先,如果我是你,我会为书籍 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();
    }
    

    【讨论】:

      猜你喜欢
      • 2011-10-01
      • 1970-01-01
      • 1970-01-01
      • 2018-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-12-05
      相关资源
      最近更新 更多