如何为多个 checkbox.Checked 编写一个事件?

How to write an event for multiple checkbox.Checked?

我正在构建一个管道服务 windows 表单,其中包含三个复选框,每个复选框的总计不同,代表服务类型。如果勾选了两个或更多,我将如何合并它们的总数,以便它们可以显示在指定的文本框中,而不是只显示单个金额。

        private void apprenticeCheck_CheckedChanged(object sender, EventArgs e)
        {
            double apprenticeCost;
            apprenticeCost = 55.00 + CALLOUT_AMOUNT;

            if (apprenticeCheck.Checked)
                serviceTotalText.Text = apprenticeCost.ToString("C");

您可以创建一个变量来跟踪总金额,并在每次选中任何复选框时更新此变量

    const int CALLOUT_AMOUNT = 5;
    double TotalCost = 0;

    private void apprenticeCheck_CheckedChanged(object sender, EventArgs e)
    {
        double apprenticeCost = 55.00 + CALLOUT_AMOUNT;

        if (apprenticeCheck.Checked)
            TotalCost += apprenticeCost;
        else
            TotalCost -= apprenticeCost;

        serviceTotalText.Text = TotalCost.ToString("C");
    }

一个简单的方法,创建一个class来表示一个服务。

public class Service
{
    public int Id { get; set; }
    public string Name { get; set; }
    public double Cost { get; set; }
}

使用 CheckBox 的私有列表,为每个 CheckBox 分配 OnCheckedChanged 事件。在 Check changed 事件中,使用 lambda 语句获取已选中 CheckBox 的总数。

代码假定 CheckBox 控件直接位于窗体上。

namespace PlumbingExample
{
    public partial class Form1 : Form
    {
        private readonly List<CheckBox> _checkBoxes;
        private double _serviceCharge = 5d;

        public Form1()
        {
            InitializeComponent();
            Shown += OnShown;
            _checkBoxes = Controls.OfType<CheckBox>().ToList();
        }

        private void OnShown(object sender, EventArgs e)
        {
            Service1CheckBox.Tag = new Service() { Id = 1, Name = "Service 1", Cost = 45.00d };
            Service2CheckBox.Tag = new Service() { Id = 2, Name = "Service 2", Cost = 55.00d };
            Service3CheckBox.Tag = new Service() { Id = 3, Name = "Service 3", Cost = 65.00d };

            _checkBoxes.ForEach(x => x.CheckStateChanged += CheckBoxOnCheckedChanged);

            serviceTotalText.Text = "[=11=].00";
        }

        private void CheckBoxOnCheckedChanged(object sender, EventArgs e)
        {
            var total = _checkBoxes
                .Where(checkBox => checkBox.Checked)
                .Select(checkBox => ((Service)checkBox.Tag).Cost + _serviceCharge)
                .Sum();

            serviceTotalText.Text = total.ToString("C");
            serviceTotalText.Tag = total;
        }
    }
}