c# - 将 3 个标签控件的值添加到输出时出错,导致另一个标签控件
问题描述
这是我想要实现的目标的完整描述。
我设计它的方式是我有
- 3 个复选框
- 3 DropDown 控件:数量
- 7 个标签控件:3 个用于单价的标签、3 个用于小计的标签和一个用于总计的标签
在页面加载时,DropDown 将被禁用,单价标签的值将分别为“100”、“200”和“100”,3 个 SubTotal 标签的初始值为“0”,GrandTotal Label 将为“0” .
当用户点击任何一个 Checkboxes 时,附加到该点击 Checkbox 的 DropDown 将被启用,当用户从 DropDown 中选择数量时,Unit Price Label 的值将乘以数量 DropDown 中的值,并在 SubTotal 中输出结果标签。
最后,将添加 SubTotal Labels 的所有值,并将结果显示在 GrandTotal Label 中。
这就是视图的样子
Product Unit Price Quantity SubTotal GrandTotal
Product1 100 3 300
Product2 200 1 200
Product3 100 2 200
700
这是我的代码(请原谅我显示代码的方式。我试图上传我的代码但它没有进入代码窗口,因为我使用移动设备来问这个问题)
protected void Page_Load(object sender, EventArgs e)
{
unitprice1.Text = ("100").ToString();
unitprice2.Text = ("200").ToString();
unitprice3.Text = ("100").ToString();
}
protected void CheckBox1_CheckedChanged(object sender, EventArgs e)
{
Product1DropDown.Enabled = CheckBox1.Checked;
Subtotal1.Text = ("0").ToString();
}
protected void CheckBox2_CheckedChanged(object sender, EventArgs e)
{
Product2DropDown.Enabled = CheckBox2.Checked;
Subtotal2.Text = ("0").ToString();
}
protected void CheckBox3_CheckedChanged(object sender, EventArgs e)
{
Product3DropDown.Enabled = CheckBox3.Checked;
Subtotal3.Text = ("0").ToString();
}
protected void Product1DropDown_SelectedIndexChanged(object sender, EventArgs e)
{
if (Product1DropDown.SelectedIndex > 0)
{
Qty1.Text = Product1DropDown.SelectedItem.Text;
Subtotal1.Text = Convert.ToString(Convert.ToInt32(Qty1.Text) * Convert.ToInt32(unitprice1.Text)).ToString();
}
}
protected void Product2DropDown_SelectedIndexChanged(object sender, EventArgs e)
{
if (Product2DropDown.SelectedIndex > 0)
{
Qty2.Text = Product2DropDown.SelectedItem.Text;
Subtotal2.Text = Convert.ToString(Convert.ToInt32(Qty2.Text) * Convert.ToInt32(unitprice2.Text)).ToString();
}
}
protected void Product3DropDown_SelectedIndexChanged(object sender, EventArgs e)
{
if(Product3DropDown.SelectedIndex > 0)
{
Qty3.Text = Product3DropDown.SelectedItem.Text;Subtotal3.Text = Convert.ToString(Convert.ToInt32(Qty3.Text) * Convert.ToInt32(unitprice3.Text)).ToString();
}
}
解决方案
确保您已包含AutoPostBack="true"
每个CheckBox
:
<asp:CheckBox ID="checkBox1" runat="server" Checked="false" OnCheckedChanged="checkBox1_CheckedChanged" AutoPostBack="true" />
并且对于每个DropDownList
:
<asp:DropDownList id="product1DropDown" runat="server" OnSelectedIndexChanged="product1DropDown_SelectedIndexChanged" AutoPostBack="true" Enabled="false" style="align-content:center;width: 75px" />
创建一个计算小计的方法。由于我们必须计算 3 种不同产品的小计,因此我们将创建一个方法。参数将是 DropDownList 中的数量,以及标签中的单价。
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;
}
接下来,创建一个计算总计的方法。此方法将调用CalculateSubtotal
每个产品。
计算总计
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");
}
在每个 CheckBoxCheckChanged
事件处理程序中,我们不仅需要确定是否启用下拉菜单,还需要重新计算总计。如果复选框被禁用,我还决定将数量和小计重置为 0。
例如:
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();
}
因为,每次更改数量时,我们都需要重新计算总计,以及该特定产品的小计,我们只需调用CalculateGrandTotal();
.
例如:
protected void product1DropDown_SelectedIndexChanged(object sender, EventArgs e)
{
CalculateGrandTotal();
}
这是完整的解决方案 - 它已经过测试:
与 2019 年相比:
创建新的ASP.NET Web 应用程序 (.NET Framework)
- 项目名称:BMICalc
- 单击创建
- 单击清空
- 单击创建
添加网络表单
- 在 VS 菜单中,单击项目
- 选择Web 表单(名称:default.aspx)
默认.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>
默认.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();
}
}
}
资源:
推荐阅读
- anylogic - Anylogic中的微分方程系统
- jasmine - Intellisense 无法在 VS Code 上使用 Jasmine
- curl - CURLINFO_SSL_ENGINES 不列出 openssl 引擎
- c++ - 位图文件无法打开
- sql - 比较行号 1 和行号 2 之间的一列值
- php - 在代码中使用 mediawiki 函数
- angular - angular primeng multiselect 在标题中显示 [object] [object]
- reactjs - 如何从父 onSubmit 触发子组件验证 - 反应
- python - 将两种日期格式转换为一种格式 pandas
- python - Matplotlib 中的 MathText 删除字符