Ensure that you've included AutoPostBack="true"
for each CheckBox
:
<asp:CheckBox ID="checkBox1" runat="server" Checked="false" OnCheckedChanged="checkBox1_CheckedChanged" AutoPostBack="true" />
and also for each DropDownList
:
<asp:DropDownList id="product1DropDown" runat="server" OnSelectedIndexChanged="product1DropDown_SelectedIndexChanged" AutoPostBack="true" Enabled="false" style="align-content:center;width: 75px" />
Create a method to calculate the subtotal. Since we have to calculate subtotals for 3 different products, we'll create a method. The parameters will be the quantity from the DropDownList, and the unit price from the label.
private decimal CalculateSubtotal(string strQty, string strUnitPrice)
{
int qty = 0;
decimal unitPrice = 0m;
decimal subtotal = 0m;
//clear msg
lblMsg.Text = string.Empty;
if (!String.IsNullOrEmpty(strQty))
{
//try to convert
Int32.TryParse(strQty, out qty);
}
else
{
throw new Exception("Error: Qty is null or empty");
}
if (!String.IsNullOrEmpty(strUnitPrice))
{
//try to convert
Decimal.TryParse(strUnitPrice, out unitPrice);
//calculate
subtotal = qty * unitPrice;
}
else
{
throw new Exception("Error: UnitPrice is null or empty");
}
return subtotal;
}
Next, create a method to calculate the grand total. This method will call CalculateSubtotal
for each of the products.
CalculateGrandTotal
private void CalculateGrandTotal()
{
decimal subtotal1 = 0m; //use 'm' for decimal
decimal subtotal2 = 0m; //use 'm' for decimal
decimal subtotal3 = 0m; //use 'm' for decimal
//calculate subtotal1 - only calculate if CheckBox is enabled
if (checkBox1.Enabled && !String.IsNullOrEmpty(product1DropDown.Text))
{
//calculate subtotal
subtotal1 = CalculateSubtotal(product1DropDown.Text, lblProduct1UnitPrice.Text);
}
//set value
lblProduct1Subtotal.Text = subtotal1.ToString("$###,##0.00");
//calculate subtotal 2 - only calculate if CheckBox is enabled
if (checkBox2.Enabled && !String.IsNullOrEmpty(product2DropDown.Text))
{
//calculate subtotal
subtotal2 = CalculateSubtotal(product2DropDown.Text, lblProduct2UnitPrice.Text);
}
//set value
lblProduct2Subtotal.Text = subtotal2.ToString("$###,##0.00");
//calculate subtotal3 - only calculate if CheckBox is enabled
if (checkBox3.Enabled && !String.IsNullOrEmpty(product3DropDown.Text))
{
//calculate subtotal
subtotal3 = CalculateSubtotal(product3DropDown.Text, lblProduct3UnitPrice.Text);
}
//set value
lblProduct3Subtotal.Text = subtotal3.ToString("$###,##0.00");
//calculate
decimal grandTotal = subtotal1 + subtotal2 + subtotal3;
//set value
lblGrandTotal.Text = grandTotal.ToString("$###,##0.00");
}
In each of the CheckBox CheckChanged
event handlers, not only do we need to determine whether or not to enable the drop down, but also re-calculate the grand total. I've also decided to reset the quantity and subtotal to 0 if the checkbox is disabled.
ex:
protected void checkBox1_CheckedChanged(object sender, EventArgs e)
{
////uncomment for debugging
//lblMsg.Text = "Info: checkBox1.Checked: " + checkBox1.Checked.ToString();
//System.Diagnostics.Debug.WriteLine("Info: checkBox1.Checked: " + checkBox1.Checked.ToString());
//set value
product1DropDown.Enabled = checkBox1.Checked;
if (!product1DropDown.Enabled)
{
//not enabled - reset values
product1DropDown.Text = string.Empty;
lblProduct1Subtotal.Text = "$0.00";
}
//calculate
CalculateGrandTotal();
}
Since, we need to re-calculate the grand total each time a quantity is changed, as well as, the subtotal for that particular product, we just call CalculateGrandTotal();
.
ex:
protected void product1DropDown_SelectedIndexChanged(object sender, EventArgs e)
{
CalculateGrandTotal();
}
Here's the complete solution-it's been tested:
VS 2019:
Create a new ASP.NET Web Application (.NET Framework)
- Project Name: BMICalc
- Click Create
- Click Empty
- Click Create
Add Web Form
- In VS menu, click Project
- Select Web Form (name: default.aspx)
default.aspx:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="default.aspx.cs" Inherits="TestAspNetDU._default" %>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
</head>
<body>
<form id="form1" runat="server">
<div style="top: 10px; left: 150px; position: absolute;">
<asp:Table ID="tbl1" BorderStyle="none" Border="0px" CellPadding="2" CellSpacing="0" runat="server" Width="410">
<asp:TableHeaderRow ID="tbl1HeaderRow">
<asp:TableHeaderCell ID="tbl1CheckBoxHeading" Text="" style="text-align:center" />
<asp:TableHeaderCell ID="tbl1ProductHeading" Text="Product" style="text-align:center" />
<asp:TableHeaderCell ID="tbl1UnitPriceHeading" Text="Unit Price" style="text-align:center" />
<asp:TableHeaderCell ID="tbl1QuantityHeading" Text="Quantity" style="text-align:center" />
<asp:TableHeaderCell ID="tbl1SubtotalHeading" Text="Subtotal" style="text-align:center" />
</asp:TableHeaderRow>
<asp:TableRow ID="tbl1Row1">
<asp:TableCell Width="35px" style="align-content:center;text-align:center;vertical-align:middle">
<asp:CheckBox ID="checkBox1" runat="server" Checked="false" OnCheckedChanged="checkBox1_CheckedChanged" AutoPostBack="true" />
</asp:TableCell>
<asp:TableCell Width="100px" style="text-align:left">
<asp:Label id="lblProduct1Name" runat="server" Text="Product1" style="text-align:left" />
</asp:TableCell>
<asp:TableCell Width="75px" style="align-content:center;text-align:center">
<asp:Label id="lblProduct1UnitPrice" runat="server" Text="100" />
</asp:TableCell>
<asp:TableCell Width="100px" style="align-content:center;text-align:center">
<asp:DropDownList id="product1DropDown" runat="server" OnSelectedIndexChanged="product1DropDown_SelectedIndexChanged" AutoPostBack="true" Enabled="false" style="align-content:center;width: 75px" />
</asp:TableCell>
<asp:TableCell Width="100px" style="text-align:right">
<asp:Label id="lblProduct1Subtotal" runat="server" Text="0.00" />
</asp:TableCell>
</asp:TableRow>
<asp:TableRow ID="tbl1Row2">
<asp:TableCell Width="35px" style="align-content:center;text-align:center;vertical-align:middle">
<asp:CheckBox ID="checkBox2" runat="server" Checked="false" OnCheckedChanged="checkBox2_CheckedChanged" AutoPostBack="true" />
</asp:TableCell>
<asp:TableCell Width="100px" style="text-align:left">
<asp:Label id="lblProduct2Name" runat="server" Text="Product2" style="text-align:left" />
</asp:TableCell>
<asp:TableCell Width="75px" style="align-content:center;text-align:center">
<asp:Label id="lblProduct2UnitPrice" runat="server" Text="200" style="text-align:center" />
</asp:TableCell>
<asp:TableCell Width="100" style="align-content:center;text-align:center">
<asp:DropDownList id="product2DropDown" runat="server" OnSelectedIndexChanged="product2DropDown_SelectedIndexChanged" AutoPostBack="true" Enabled="false" style="align-content:center;width: 75px" />
</asp:TableCell>
<asp:TableCell Width="100px" style="text-align:right">
<asp:Label id="lblProduct2Subtotal" runat="server" Text="0.00" />
</asp:TableCell>
</asp:TableRow>
<asp:TableRow ID="tbl1Row3">
<asp:TableCell Width="35px" style="align-content:center;text-align:center;vertical-align:middle">
<asp:CheckBox ID="checkBox3" runat="server" Checked="false" OnCheckedChanged="checkBox3_CheckedChanged" AutoPostBack="true" />
</asp:TableCell>
<asp:TableCell Width="100px" style="text-align:left">
<asp:Label id="lblProduct3Name" runat="server" Text="Product3" style="text-align:left" />
</asp:TableCell>
<asp:TableCell Width="75px" style="align-content:center;text-align:center">
<asp:Label id="lblProduct3UnitPrice" runat="server" Text="100" style="text-align:center" />
</asp:TableCell>
<asp:TableCell Width="100" style="align-content:center;text-align:center">
<asp:DropDownList id="product3DropDown" runat="server" OnSelectedIndexChanged="product3DropDown_SelectedIndexChanged" AutoPostBack="true" Enabled="false" style="align-content:center;width: 75px" />
</asp:TableCell>
<asp:TableCell Width="100px" style="text-align:right">
<asp:Label id="lblProduct3Subtotal" runat="server" Text="0.00" />
</asp:TableCell>
</asp:TableRow>
</asp:Table>
</div>
<div style="top: 120px; left: 150px; position: absolute">
<asp:Table ID="tbl1GrandTotal" BorderStyle="none" Border="0px" CellPadding="0" CellSpacing="0" runat="server" Width="410">
<asp:TableRow ID="tbl1GrandTotalRow">
<asp:TableCell Width="160px" style="align-content:center;text-align:center;vertical-align:middle"></asp:TableCell>
<asp:TableCell Width="125px" style="font-weight:bold; text-align:center">
<asp:Label id="lblGrandTotalHeading" runat="server" Text="Grand Total:" />
</asp:TableCell>
<asp:TableCell Width="100px" style="font-weight:bold; text-align:right">
<asp:Label id="lblGrandTotal" runat="server" Text="0.00" />
</asp:TableCell>
</asp:TableRow>
</asp:Table>
</div>
<div style="top: 625px; left: 150px; position: absolute">
<span style="color:red">
<asp:Label ID="lblMsg" runat="server" Text="" />
</span>
</div>
</form>
</body>
</html>
default.aspx.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
namespace TestAspNetDU
{
public partial class _default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
//set values
lblProduct1UnitPrice.Text = "100";
lblProduct2UnitPrice.Text = "200";
lblProduct3UnitPrice.Text = "100";
//populate DropDownList
for(int i = 0; i < 100; i++)
{
if (i > 0)
{
//add
product1DropDown.Items.Add(i.ToString());
product2DropDown.Items.Add(i.ToString());
product3DropDown.Items.Add(i.ToString());
}
else
{
//add - for 0, show empty (blank)
product1DropDown.Items.Add("");
product2DropDown.Items.Add("");
product3DropDown.Items.Add("");
}
}
}
private void CalculateGrandTotal()
{
decimal subtotal1 = 0m; //use 'm' for decimal
decimal subtotal2 = 0m; //use 'm' for decimal
decimal subtotal3 = 0m; //use 'm' for decimal
try
{
//calculate subtotal1 - only calculate if CheckBox is enabled
if (checkBox1.Enabled && !String.IsNullOrEmpty(product1DropDown.Text))
{
//calculate subtotal
subtotal1 = CalculateSubtotal(product1DropDown.Text, lblProduct1UnitPrice.Text);
}
//set value
lblProduct1Subtotal.Text = subtotal1.ToString("$###,##0.00");
}
catch(Exception ex)
{
//ToDo: log msg
//set value
lblMsg.Text = "Error (CalculateGrandTotal 1) - " + ex.Message;
//uncommenting the following line may be useful for debugging
//throw ex;
}
try
{
//calculate subtotal 2 - only calculate if CheckBox is enabled
if (checkBox2.Enabled && !String.IsNullOrEmpty(product2DropDown.Text))
{
//calculate subtotal
subtotal2 = CalculateSubtotal(product2DropDown.Text, lblProduct2UnitPrice.Text);
}
//set value
lblProduct2Subtotal.Text = subtotal2.ToString("$###,##0.00");
}
catch(Exception ex)
{
//ToDo: log msg
//set value
lblMsg.Text = "Error (CalculateGrandTotal 2) - " + ex.Message;
//uncommenting the following line may be useful for debugging
//throw ex;
}
try
{
//calculate subtotal3 - only calculate if CheckBox is enabled
if (checkBox3.Enabled && !String.IsNullOrEmpty(product3DropDown.Text))
{
//calculate subtotal
subtotal3 = CalculateSubtotal(product3DropDown.Text, lblProduct3UnitPrice.Text);
}
//set value
lblProduct3Subtotal.Text = subtotal3.ToString("$###,##0.00");
}
catch(Exception ex)
{
//ToDo: log msg
//set value
lblMsg.Text = "Error (product3DropDown_SelectedIndexChanged) - " + ex.Message;
//uncommenting the following line may be useful for debugging
//throw ex;
}
//calculate
decimal grandTotal = subtotal1 + subtotal2 + subtotal3;
//set value
lblGrandTotal.Text = grandTotal.ToString("$###,##0.00");
}
private decimal CalculateSubtotal(string strQty, string strUnitPrice)
{
int qty = 0;
decimal unitPrice = 0m;
decimal subtotal = 0m;
//clear msg
lblMsg.Text = string.Empty;
if (!String.IsNullOrEmpty(strQty))
{
//try to convert
Int32.TryParse(strQty, out qty);
}
else
{
throw new Exception("Error: Qty is null or empty");
}
if (!String.IsNullOrEmpty(strUnitPrice))
{
//try to convert
Decimal.TryParse(strUnitPrice, out unitPrice);
//calculate
subtotal = qty * unitPrice;
}
else
{
throw new Exception("Error: UnitPrice is null or empty");
}
return subtotal;
}
protected void checkBox1_CheckedChanged(object sender, EventArgs e)
{
////uncomment for debugging
//lblMsg.Text = "Info: checkBox1.Checked: " + checkBox1.Checked.ToString();
//System.Diagnostics.Debug.WriteLine("Info: checkBox1.Checked: " + checkBox1.Checked.ToString());
//set value
product1DropDown.Enabled = checkBox1.Checked;
if (!product1DropDown.Enabled)
{
//not enabled - reset values
product1DropDown.Text = string.Empty;
lblProduct1Subtotal.Text = "$0.00";
}
//calculate
CalculateGrandTotal();
}
protected void checkBox2_CheckedChanged(object sender, EventArgs e)
{
//uncomment for debugging
//lblMsg.Text = "Info: checkBox2.Checked: " + checkBox2.Checked.ToString();
//set value
product2DropDown.Enabled = checkBox2.Checked;
if (!product2DropDown.Enabled)
{
//not enabled - reset values
product2DropDown.Text = string.Empty;
lblProduct2Subtotal.Text = "$0.00";
}
//calculate
CalculateGrandTotal();
}
protected void checkBox3_CheckedChanged(object sender, EventArgs e)
{
//uncomment for debugging
//lblMsg.Text = "Info: checkBox3.Checked: " + checkBox3.Checked.ToString();
//set value
product3DropDown.Enabled = checkBox3.Checked;
if (!product3DropDown.Enabled)
{
//not enabled - reset values
product3DropDown.Text = string.Empty;
lblProduct3Subtotal.Text = "$0.00";
}
//calculate
CalculateGrandTotal();
}
protected void product1DropDown_SelectedIndexChanged(object sender, EventArgs e)
{
CalculateGrandTotal();
}
protected void product2DropDown_SelectedIndexChanged(object sender, EventArgs e)
{
CalculateGrandTotal();
}
protected void product3DropDown_SelectedIndexChanged(object sender, EventArgs e)
{
CalculateGrandTotal();
}
}
}

Resources: