hello,
I'm using GridView inside a repeater control to populate and bill separately for each table.
I add the first 2 rows and it works well but when I add the 3rd row, it just adds the total value to all the tables total amount and hence the calculation error.
Can someone help me?
my aspx code:
<asp:Repeater ID="rptrTables" runat="server" OnItemDataBound="rptrTables_ItemDataBound">
<ItemTemplate>
<div class="col-md-6">
<asp:Panel ID="dvTable" runat="server" CssClass="card card-info card-outline" ClientIDMode="Static">
<div class="card-header with-border">
<h3 class="card-title">
<asp:Label ID="lblTableNumber" runat="server" Text='<%# Eval("tname") %>'></asp:Label></h3>
<asp:HiddenField ID="TableStatusHF" runat="server" Value='<%# Eval("status") %>' />
<asp:HiddenField ID="PanelStatusHF" runat="server" Value="0" />
<asp:HiddenField ID="OrderId" runat="server" />
<div class="card-tools">
<button type="button" class="btn btn-tool" data-widget="collapse" onclick="return setPanelState();">
<i class="fa fa-minus"></i>
</button>
</div>
</div>
<div class="card-body" style="height: 350px; overflow: scroll">
<div class="row">
<div class="col-md-12">
<div class="form-group">
<asp:GridView ID="grdOrder" runat="server" AutoGenerateColumns="false" CssClass="table table-bordered table-responsive-sm" GridLines="None" HeaderStyle-Wrap="false" ShowFooter="false" OnRowDataBound="gvRowDataBound">
<Columns>
<asp:TemplateField HeaderText="Items" ItemStyle-Wrap="false" HeaderStyle-Wrap="false">
<ItemTemplate>
<asp:DropDownList ID="drpItemname" runat="server" Width="165px" CssClass="form-control form-control-sm select2" OnSelectedIndexChanged="GetItemDetails" AutoPostBack="true">
</asp:DropDownList>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Price">
<ItemTemplate>
<asp:TextBox ID="lblUnitPrice" runat="server" CssClass="form-control form-control-sm" Text='<%# Eval("Column2")%>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Qty">
<ItemTemplate>
<asp:TextBox ID="lblQuantity" runat="server" CssClass="form-control form-control-sm" Text='<%# Eval("Column3")%>' OnTextChanged="CalculateLineTotal" AutoPostBack="true" TextMode="Number"></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField HeaderText="Line Total">
<ItemTemplate>
<asp:TextBox ID="lblLineTotal" runat="server" CssClass="form-control form-control-sm" Text='<%# Eval("Column4")%>'></asp:TextBox>
</ItemTemplate>
</asp:TemplateField>
<asp:TemplateField>
<ItemTemplate>
<div class="btn-group">
<asp:LinkButton ID="ButtonRemove" runat="server" CssClass="btn btn-outline-danger btn-sm" OnClick="AddItem"><i class="fa fa-trash-alt"></i></asp:LinkButton>
<asp:LinkButton ID="ButtonAdd" runat="server" CssClass="btn btn-outline-primary btn-sm" OnClick="AddItem"><i class="fa fa-plus-circle"></i></asp:LinkButton>
</div>
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label>Sub Total</label>
<asp:TextBox ID="txtSubTotal" runat="server" CssClass="form-control form-control-sm" placeholder="Sub Total" Enabled="false" Text="0"></asp:TextBox>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label>Enter GST %</label>
<asp:TextBox ID="txtGst" runat="server" CssClass="form-control form-control-sm" placeholder="GST %" TextMode="Number" Text="0"></asp:TextBox>
</div>
</div>
<div class="col-md-4">
<div class="form-group">
<label>Grand Total</label>
<asp:TextBox ID="txtGrandTotal" runat="server" CssClass="form-control form-control-sm" placeholder="Grand Total" Enabled="false" Text="0"></asp:TextBox>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label>Customer Name</label>
<asp:TextBox ID="txtCustomerName" runat="server" CssClass="form-control form-control-sm" placeholder="Customer Name"></asp:TextBox>
</div>
</div>
<div class="col-md-6">
<div class="form-group">
<label>Customer Mobile</label>
<asp:TextBox ID="txtCustomerMobile" runat="server" CssClass="form-control form-control-sm" placeholder="Mobile Number"></asp:TextBox>
</div>
</div>
</div>
</div>
<div class="card-footer">
<div class="float-right">
<div class="btn-group">
<asp:Button ID="btnSubmit" runat="server" CausesValidation="false" TabIndex="2" CssClass="btn btn-outline-primary btn-sm"
Text="Print KOT" />
<asp:Button ID="Button1" runat="server" CausesValidation="false" TabIndex="2" CssClass="btn btn-outline-primary btn-sm"
Text="Generate Bill" />
</div>
</div>
</div>
</asp:Panel>
</div>
</ItemTemplate>
</asp:Repeater>
c# code:
public static string OrderID;
protected void AddItem(object sender, EventArgs e)
{
LinkButton btn = (sender) as LinkButton;
decimal sum = 0;
GridView gvOrders = (GridView)(btn.NamingContainer as GridViewRow).NamingContainer;
string id = ((gvOrders.NamingContainer as RepeaterItem).FindControl("lblTableNumber") as Label).Text;
List<RptDetails> rpt = new List<RptDetails>();
if (ViewState["RptDetails"] != null)
{
List<RptDetails> rpt1 = (List<RptDetails>)ViewState["RptDetails"];
var q = rpt1.Find(x => x.CustomerId == id);
if (q == null)
{
DataTable dtCurrentTable = rpt1[0].DtDetails.Clone();
DataRow drCurrentRow = dtCurrentTable.NewRow();
dtCurrentTable.Rows.Add(drCurrentRow);
for (int i = 0; i < gvOrders.Rows.Count; i++)
{
DropDownList ddl1 = (DropDownList)gvOrders.Rows[i].Cells[1].FindControl("drpItemname");
TextBox text1 = (TextBox)gvOrders.Rows[i].Cells[2].FindControl("lblUnitPrice");
TextBox text2 = (TextBox)gvOrders.Rows[i].Cells[3].FindControl("lblQuantity");
TextBox text3 = (TextBox)gvOrders.Rows[i].Cells[4].FindControl("lblLineTotal");
dtCurrentTable.Rows[i]["Items"] = ddl1.SelectedItem.Text;
dtCurrentTable.Rows[i]["Column2"] = text1.Text;
dtCurrentTable.Rows[i]["Column3"] = text2.Text;
dtCurrentTable.Rows[i]["Column4"] = text3.Text;
foreach (RepeaterItem item in rptrTables.Items)
{
string OrderId = ((gvOrders.NamingContainer as RepeaterItem).FindControl("OrderId") as HiddenField).Value;
string txtSubTotal = ((gvOrders.NamingContainer as RepeaterItem).FindControl("txtSubTotal") as TextBox).Text;
string txtGst = ((gvOrders.NamingContainer as RepeaterItem).FindControl("txtGst") as TextBox).Text;
string txtGrandTotal = ((gvOrders.NamingContainer as RepeaterItem).FindControl("txtGrandTotal") as TextBox).Text;
string txtCustomerName = ((gvOrders.NamingContainer as RepeaterItem).FindControl("txtCustomerName") as TextBox).Text;
string txtCustomerMobile = ((gvOrders.NamingContainer as RepeaterItem).FindControl("txtCustomerMobile") as TextBox).Text;
sum += decimal.Parse(text3.Text);
txtSubTotal = sum.ToString("#0.00");
txtGrandTotal = sum.ToString("#0.00");
}
}
rpt.Add(new RptDetails { CustomerId = id, DtDetails = dtCurrentTable });
dtCurrentTable.Rows.Add();
}
else
{
DataTable dt = q.DtDetails;
for (int i = 0; i < gvOrders.Rows.Count; i++)
{
DataRow drCurrentRow = dt.NewRow();
DropDownList ddl1 = (DropDownList)gvOrders.Rows[i].Cells[1].FindControl("drpItemname");
TextBox text1 = (TextBox)gvOrders.Rows[i].Cells[2].FindControl("lblUnitPrice");
TextBox text2 = (TextBox)gvOrders.Rows[i].Cells[3].FindControl("lblQuantity");
TextBox text3 = (TextBox)gvOrders.Rows[i].Cells[4].FindControl("lblLineTotal");
dt.Rows[i]["Items"] = ddl1.SelectedItem.Text;
dt.Rows[i]["Column2"] = text1.Text;
dt.Rows[i]["Column3"] = text2.Text;
dt.Rows[i]["Column4"] = text3.Text;
foreach (RepeaterItem item in rptrTables.Items)
{
TextBox SubTotalTxt = (TextBox)item.FindControl("txtSubTotal");
TextBox GST = (TextBox)item.FindControl("txtGst");
TextBox GrandTotalTxt = (TextBox)item.FindControl("txtGrandTotal");
sum += decimal.Parse(text3.Text);
SubTotalTxt.Text = sum.ToString("#0.00");
GrandTotalTxt.Text = sum.ToString("#0.00");
}
}
rpt.Add(new RptDetails { CustomerId = id, DtDetails = dt });
dt.Rows.Add();
}
ViewState["RptDetails"] = rpt;
gvOrders.DataSource = rpt[0].DtDetails;
gvOrders.DataBind();
}
else
{
Response.Write("ViewState is null");
}
SetPreviousData();
}
protected void GetItemDetails(object sender, EventArgs e)
{
decimal totamt;
foreach (RepeaterItem rptrItems in rptrTables.Items)
{
GridView gvItems = (GridView)rptrItems.FindControl("grdOrder");
//GridView gvItems = (GridView)rptrTables.Items[0].FindControl("grdOrder");
foreach (GridViewRow row in gvItems.Rows)
{
DropDownList ddl = sender as DropDownList;
Control ctrl = row.FindControl("drpItemname") as DropDownList;
if (ctrl != null)
{
DropDownList ddl1 = (DropDownList)ctrl;
if (ddl.ClientID == ddl1.ClientID)
{
TextBox SubTotalTxt = (TextBox)rptrItems.FindControl("txtSubTotal");
TextBox GST = (TextBox)rptrItems.FindControl("txtGst");
TextBox GrandTotalTxt = (TextBox)rptrItems.FindControl("txtGrandTotal");
TextBox UnitPrice = row.FindControl("lblUnitPrice") as TextBox;
TextBox QTTY = row.FindControl("lblQuantity") as TextBox;
TextBox UPrice = row.FindControl("lblUnitPrice") as TextBox;
TextBox LINETOTAL = row.FindControl("lblLineTotal") as TextBox;
SqlConnection conn = new SqlConnection(constring);
conn.Open();
if (ctrl != null)
{
if ((ddl1.ID == ddl.ID) && (ddl1.SelectedIndex == ddl.SelectedIndex))
{
string str = "select * from mast_item where itemname='" + ddl1.SelectedItem.ToString() + "'";
SqlCommand com = new SqlCommand(str, conn);
SqlDataReader reader = com.ExecuteReader();
while (reader.Read())
{
UnitPrice.Text = reader["price"].ToString();
QTTY.Text = "1";
totamt = Convert.ToDecimal(QTTY.Text) * Convert.ToDecimal(UnitPrice.Text);
LINETOTAL.Text = totamt.ToString("#0.00");
SubTotalTxt.Text = (totamt + Convert.ToDecimal(SubTotalTxt.Text)).ToString("#0.00");
GrandTotalTxt.Text = (totamt + Convert.ToDecimal(GrandTotalTxt.Text)).ToString("#0.00");
}
reader.Close();
conn.Close();
}
else
{
ScriptManager.RegisterStartupScript(this, this.GetType(), "swal", "swal('Item already selected, you can increase the quantity instead!', 'Happy Cakes, Vijayapura', 'warning');", true);
}
}
}
}
}
}
}
screens:
https://pasteboard.co/JuFW8DJ.gif