簡體   English   中英

添加 3 個標簽控件的值以在另一個標簽控件中輸出結果時出錯

[英]Error with adding values of 3 label controls to output result in another label control

這是我想要實現的目標的完整描述。

我設計它的方式是我有

  • 3 復選框
  • 3 下拉控件:數量
  • 7 個標簽控件:3 個單價標簽、3 個小計標簽和一個 GrandTotal 標簽

在頁面加載時,DropDown 將被禁用,單價標簽的值分別為“100”、“200”和“100”,3 個小計標簽的初始值為“0”,GrandTotal 標簽將為“0” .

當用戶單擊任何一個復選框時,將啟用附加到該單擊復選框的下拉列表,當用戶從下拉列表中選擇數量時,單價標簽的值將乘以數量下拉列表中的值,並在 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();
    }
}    

確保您已為每個CheckBox包含AutoPostBack="true"

<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

計算GrandTotal

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

在每個 CheckBox CheckChanged事件處理程序中,我們不僅需要判斷是否啟用下拉,還需要重新計算總計。 如果復選框被禁用,我還決定將數量和小計重置為 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();
}

這是完整的解決方案 - 它已經過測試:

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

在此處輸入圖片說明

資源

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM