Hello,
I'm using a Gridview to show data and in the last TemplateField I've a TextBox to enter today's prepared stock which will then be added to the quantity through query. I'm using for each to update all the rows but when I click on update, it is updating only the first row.
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="false" OnRowEditing="EditCustomer" CssClass="table table-bordered dataTable table-responsive-sm" GridLines="None" Width="100%" OnRowUpdating="UpdateCustomer" OnRowDataBound="GridView1_RowDataBound" OnRowCancelingEdit="CancelEdit">
<Columns>
<asp:TemplateField HeaderText="Delete">
<ItemTemplate>
<asp:LinkButton ID="lnkRemove" runat="server" Text="" CausesValidation="false" CommandArgument='<%# Eval("id")%>' CssClass="btn btn-danger btn-sm fa fa-trash" OnClientClick="return confirm('Do you want to delete?')" OnClick="DeleteCustomer"></asp:LinkButton>
</ItemTemplate>
</asp:TemplateField>
<asp:CommandField ShowEditButton="True" HeaderText="Edit" CausesValidation="false" EditText="" ButtonType="Link" ControlStyle-CssClass="btn btn-primary btn-sm fa fa-edit" />
<asp:TemplateField HeaderText="Sl. No." ItemStyle-Wrap="false">
<ItemTemplate>
<%#Container.DataItemIndex + 1 %>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Date" ItemStyle-Wrap="false">
<ItemTemplate>
<asp:Label ID="lblPrepDate" runat="server" Text='<%# Eval("prepdate")%>'></asp:Label>
<asp:HiddenField ID="hfID" runat="server" Value='<%# Eval("id")%>'></asp:HiddenField>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Item Name" HeaderStyle-Wrap="false" ItemStyle-Wrap="false">
<ItemTemplate>
<asp:Label ID="lblItemName" runat="server" Text='<%# Eval("itemname")%>'></asp:Label>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Quantity" ItemStyle-Wrap="false">
<ItemTemplate>
<asp:Label ID="lblQty" runat="server" Text='<%# Eval("qtty")%>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtqttygrd" CssClass="form-control form-control-sm" runat="server" placeholder='<%# Eval("qtty")%>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Unit Price" ItemStyle-Wrap="false">
<ItemTemplate>
<asp:Label ID="lblUP" runat="server" Text='<%# Eval("unitprice")%>'></asp:Label>
</ItemTemplate>
<EditItemTemplate>
<asp:TextBox ID="txtunitpricegrd" CssClass="form-control form-control-sm" runat="server" Text='<%# Eval("unitprice")%>'></asp:TextBox>
</EditItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Prepared Today" ItemStyle-Wrap="false">
<ItemTemplate>
<asp:TextBox ID="txtPrepStkgrd" CssClass="form-control form-control-sm" runat="server" placeholder="0"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
<asp:LinkButton ID="btnBulkUpdate" runat="server" CssClass="btn btn-outline-warning fa fa-edit pull-right" OnClick="BulkUpdate" CausesValidation="false"> Update Stock</asp:LinkButton>
And below is the c# code behind:
protected void BulkUpdate(object sender, EventArgs e)
{
foreach (GridViewRow row in GridView1.Rows)
{
Control ctrl2 = row.FindControl("txtPrepStkgrd") as TextBox;
if (ctrl2 != null)
{
TextBox txtPrepStkgrd = row.FindControl("txtPrepStkgrd") as TextBox;
string ID = ((HiddenField)row.FindControl("hfID")).Value;
if (!string.IsNullOrWhiteSpace(txtPrepStkgrd.Text))
{
string UpdateQuery = "update Stock set prepdate=@cdate, qtty=(CAST(IsNULL(qtty, '0') as int)) + (CAST(IsNULL(@qtty, '0') as int)), prepstk=@qtty, sldstk=@sldstk, clstk=@qtty where id=@id;";
using (SqlConnection con = new SqlConnection(constring))
{
con.Open();
using (SqlCommand cmd = new SqlCommand(UpdateQuery, con))
{
cmd.Parameters.AddWithValue("@id", ID);
cmd.Parameters.AddWithValue("@qtty", txtPrepStkgrd.Text);
cmd.Parameters.AddWithValue("@cdate", systemdate);
cmd.Parameters.AddWithValue("@sldstk", "0");
GridView1.EditIndex = -1;
GridView1.DataSource = GetData(cmd);
GridView1.DataBind();
BindData();
Response.Redirect("~/Stock");
}
con.Close();
}
}
}
}
}
Please help me solve this issue!