更新对象集合中的对象

问题描述 投票:0回答:1

我正在尝试访问和更改对象绑定列表中对象的值。

我有一个包含这些包对象的包的绑定列表:

private BindingList<Package> packages;

Package standardPackage = new Package("Standard",7.5m,standardInterior,standardExterior);
Package deluxePackage = new Package("Deluxe",15,deluxeInterior,deluxeExterior);
Package executivePackage = new Package("Executive", 35, executiveInterior, executiveInterior);
Package luxuryPackage = new Package("Luxury",55,luxuryInterior,luxuryExterior);

this.packages.Add(standardPackage);
this.packages.Add(deluxePackage);
this.packages.Add(executivePackage);
this.packages.Add(luxuryPackage);

包装的每个内部元素都有与所述包装相关的香味。 我创建了一个带有开关盒的方法来识别香水并返回香水的价格。

private decimal Update_Price_With_Fragrance()
        {
            decimal price = 0;
            string fragrance = this.fragrancesSource.Current.ToString();

            switch(fragrance)
            {
                case "Hawaiian Mist":
                    price = 2.75m;
                    break;

                case "Baby Powder":
                    price = 1.5m;
                    break;

                case "Country Floral":
                    price = 2.25m;
                    break;

                case "Pina Colada":
                    price = .75m;
                    break;

                case "Vanilla":
                    price = 2.0m;
                    break;
            }
            return price;
        }

我还有一个事件处理程序,当组合框选择的索引发生变化以根据选择的香水更新包的价格时,但是我如何访问包绑定列表中每个包的价格元素?

c# bindinglist
1个回答
0
投票

以下显示了一种可以将

ComboBox
ListBox
一起用于您的“洗车”项目的方法,如 here.

创建一个新的

Windows Forms App (.NET Framework)
(名称:CarWashDL)

现在,我们将创建一些包含属性的类,我们将使用这些属性来保存我们将要使用的数据。

创建类(名称:CarWashFragrance.cs)

public class CarWashFragrance
{
    public string Name { get; set; }
    public string Description { get; set; }
    public decimal AlaCartePrice { get; set; }
    public string Classification { get; set; }
    public decimal UpCharge { get; set; }

    public string DisplayName
    {
        //this property is used to change how the name appears in the ComboBox

        get
        {
            if (Name == "None")
                return Name;
            else if (UpCharge == 0)
                return $"{Name} ({Classification})";
            else
                return $"{Name} (+{UpCharge})"; 
        }
    }

    public string DisplayNameCustom
    {
        //this property is used to change how the name appears in the ComboBox
        //when a 'Custom' package has been selected

        get
        {
            if (Name == "None")
                return Name;
            else
                return $"{Name} (+{AlaCartePrice})";
        }
    }
}

创建类(名称:CarWashService.cs)

public class CarWashService
{
    public string Name { get; set; }
    public string PackageName { get; set; }
    public string Description { get; set; }
    public decimal AlaCartePrice { get; set; }

    public string DisplayName
    {
        get { return $"{Name}";}
    }

    public string DisplayNameCustom
    {
        //this property is used to change how the name appears in the ListBox

        get
        { 
            if (Name == "Fragrance")
                return $"{Name} (varies)";
            else
                return $"{Name} (+{AlaCartePrice})"; 
        }
    }

    public override string ToString()
    {
        return $"Name: '{Name}' Description: '{Description}' PackageName: '{PackageName}' AlaCartePrice: {AlaCartePrice}";
    }
}

创建一个类(名称:CarWashInterior.cs)

public class CarWashInterior
{
    public CarWashFragrance Fragrance { get; set; } = new CarWashFragrance();
    public List<CarWashService> InteriorServices { get; set; } = new List<CarWashService>();
}

创建类(名称:CarWashPackage.cs)

   public class CarWashPackage
{
    public string Name { get; set; }
    public string Description { get; set; }
    public decimal Price { get; set; }
    public List<CarWashService> ExteriorServices { get; set; } = new List<CarWashService>();
    public CarWashInterior Interior { get; set; } = new CarWashInterior();

    public override string ToString()
    {
        return $"Name: '{Name}' Level: ' Price: '{Price}'";
    }
}

以下类并不是真正必需的 - 可以将方法放在您的

Form
中。我用它们来展示替代方案。下面的数据存储在 Property 中,但可以通过 PropertyMethod 访问。

创建类(名称:DefaultCarWashFragrance.cs)

使用指令添加

  • using System.Collections.Generic;

DefaultCarWashFragrance

public static class DefaultCarWashFragrances
{
    //create new instance
    public static List<CarWashFragrance> Fragrances { get; private set; } = new List<CarWashFragrance>();

    static DefaultCarWashFragrances() 
    {
        //add fragrance information
        Fragrances.Add(new CarWashFragrance() { Name = "None", AlaCartePrice = 0, Classification = "None" });
        Fragrances.Add(new CarWashFragrance() { Name = "Cinnamon", AlaCartePrice = 2.99m, Classification = "Executive"});
        Fragrances.Add(new CarWashFragrance() { Name = "Coconut", AlaCartePrice = 2.99m, Classification = "Executive" });
        Fragrances.Add(new CarWashFragrance() { Name = "Ocean Breeze", AlaCartePrice = 3.99m, Classification = "Luxury", UpCharge = 1 });
        Fragrances.Add(new CarWashFragrance() { Name = "Pepermint", AlaCartePrice = 2.99m, Classification = "Executive" });
        Fragrances.Add(new CarWashFragrance() { Name = "Pine", AlaCartePrice = 2.99m, Classification = "Executive"});
        Fragrances.Add(new CarWashFragrance() { Name = "Spermint", AlaCartePrice = 2.99m, Classification = "Executive"});
        Fragrances.Add(new CarWashFragrance() { Name = "Strawberry", AlaCartePrice = 2.99m, Classification = "Executive" });
        Fragrances.Add(new CarWashFragrance() { Name = "Vanilla", AlaCartePrice = 2.99m, Classification = "Executive"});
    }

    public static List<CarWashFragrance> GetFragrances()
    {
        return Fragrances;
    }
}

创建类(名称:DefaultCarWashPackages.cs)

使用指令添加

  • using System.Collections.Generic;

默认洗车包

public static class DefaultCarWashPackages
{
    public static List<CarWashPackage> Packages { get; private set; } = new List<CarWashPackage> ();

    static DefaultCarWashPackages()
    {
        //Standard
        Packages.Add(new CarWashPackage()
        {
            Name = "Standard",
            Description = "Standard",
            Price = 15.99m,
            ExteriorServices = GetCarWashServicesExterior("Standard"),
            Interior = new CarWashInterior() { InteriorServices = GetCarWashServicesInterior("Standard") }
        });

        //Deluxe
        Packages.Add(new CarWashPackage()
        {
            Name = "Deluxe",
            Description = "Deluxe",
            Price = 25.99m,
            ExteriorServices = GetCarWashServicesExterior("Deluxe"),
            Interior = new CarWashInterior() { InteriorServices = GetCarWashServicesInterior("Deluxe") } 
        });

        //Executive
        Packages.Add(new CarWashPackage()
        {
            Name = "Executive",
            Description = "Executive",
            Price = 32.99m,
            ExteriorServices = GetCarWashServicesExterior("Executive"),
            Interior = new CarWashInterior() { InteriorServices = GetCarWashServicesInterior("Executive") }
        });

        //Luxury
        Packages.Add(new CarWashPackage()
        {
            Name = "Luxury",
            Description = "Luxury",
            Price = 49.99m,
            ExteriorServices = GetCarWashServicesExterior("Luxury"),
            Interior = new CarWashInterior() { InteriorServices = GetCarWashServicesInterior("Luxury") }
        });

        //Custom
        Packages.Add(new CarWashPackage()
        {
            Name = "Custom",
            Description = "Custom",
            Price = 49.99m,
            ExteriorServices = GetCarWashServicesExterior("Custom"),
            Interior = new CarWashInterior() { InteriorServices = GetCarWashServicesInterior("Custom") }
        });
    }

    private static List<CarWashService> GetCarWashServicesExterior(string packageName)
    {
        //create new instance
        List<CarWashService> carWashServices = new List<CarWashService>();

        //only add services for specified package name (ie: Standard, Deluxe, etc...)
        switch (packageName)
        {
            case "Standard":
                carWashServices.Add(new CarWashService() { PackageName = "Standard", Name = "Wash", AlaCartePrice = 9.99m });
                carWashServices.Add(new CarWashService() { PackageName = "Standard", Name = "Air Dry", AlaCartePrice = 0});
                break;
            case "Deluxe":
                carWashServices.Add(new CarWashService() { PackageName = "Deluxe", Name = "Wash", AlaCartePrice = 9.99m});
                carWashServices.Add(new CarWashService() { PackageName = "Deluxe", Name = "Blow Dry", AlaCartePrice = 2.99m });
                carWashServices.Add(new CarWashService() { PackageName = "Deluxe", Name = "Hand Wax", AlaCartePrice = 12.99m });
                break;
            case "Executive":
                carWashServices.Add(new CarWashService() { PackageName = "Executive", Name = "Wash", AlaCartePrice = 9.99m});
                carWashServices.Add(new CarWashService() { PackageName = "Executive", Name = "Hand Dry", AlaCartePrice = 15.99m });
                carWashServices.Add(new CarWashService() { PackageName = "Executive", Name = "Hand Wax", AlaCartePrice = 20.99m});
                carWashServices.Add(new CarWashService() { PackageName = "Executive", Name = "Wheel Polish", AlaCartePrice = 9.99m });
                break;
            default:
                //these services are the same for both 'Custom' and 'Luxury'
                //we'll change the 'PackageName' below if 'Custom' was specified
                carWashServices.Add(new CarWashService() { PackageName = "Luxury", Name = "Wash", AlaCartePrice = 9.99m});
                carWashServices.Add(new CarWashService() { PackageName = "Luxury", Name = "Hand Dry", AlaCartePrice = 15.99m });
                carWashServices.Add(new CarWashService() { PackageName = "Luxury", Name = "Hand Wax", AlaCartePrice = 20.99m});
                carWashServices.Add(new CarWashService() { PackageName = "Luxury", Name = "Wheel Polish", AlaCartePrice = 7.99m });
                carWashServices.Add(new CarWashService() { PackageName = "Luxury", Name = "Detail Engine Compartment", AlaCartePrice = 19.99m });
                break;
        }

        //both 'Custom' and 'Luxury' have the same services,
        //if 'Custom' was specified, change the 'PackageName' to 'Custom'
        if (packageName == "Custom")
        {
            for (int i = 0; i < carWashServices.Count; i++)
            {
                //update package name
                carWashServices[i].PackageName = "Custom";
            }
        }

        return carWashServices;
    }

    private static List<CarWashService> GetCarWashServicesInterior(string packageName)
    {
        //create new instance
        List<CarWashService> carWashServices = new List<CarWashService>();

        //only add services for specified package name (ie: Standard, Deluxe, etc...)
        switch (packageName)
        {
            case "Standard":
                carWashServices.Add(new CarWashService() { PackageName = "Standard", Name = "Vacuum", AlaCartePrice = 9.99m});
                break;
            case "Deluxe":
                carWashServices.Add(new CarWashService() { PackageName = "Deluxe", Name = "Vacuum", AlaCartePrice = 9.99m });
                carWashServices.Add(new CarWashService() { PackageName = "Deluxe", Name = "Shampoo Carpet", AlaCartePrice = 6.99m});
                break;
            case "Executive":
                carWashServices.Add(new CarWashService() { PackageName = "Executive", Name = "Vacuum", AlaCartePrice = 9.99m});
                carWashServices.Add(new CarWashService() { PackageName = "Executive", Name = "Shampoo Carpet", AlaCartePrice = 6.99m });
                carWashServices.Add(new CarWashService() { PackageName = "Executive", Name = "Shampoo Upholstery", AlaCartePrice = 9.99m });
                carWashServices.Add(new CarWashService() { PackageName = "Executive", Name = "Fragrance" });
                break;
            default:
                //these services are the same for both 'Custom' and 'Luxury'
                //we'll change the 'PackageName' below if 'Custom' was specified
                carWashServices.Add(new CarWashService() { PackageName = "Luxury", Name = "Vacuum", AlaCartePrice = 9.99m });
                carWashServices.Add(new CarWashService() { PackageName = "Luxury", Name = "Shampoo Carpet", AlaCartePrice = 6.99m });
                carWashServices.Add(new CarWashService() { PackageName = "Luxury", Name = "Shampoo Upholstery", AlaCartePrice = 9.99m });
                carWashServices.Add(new CarWashService() { PackageName = "Luxury", Name = "Fragrance" });
                carWashServices.Add(new CarWashService() { PackageName = "Luxury", Name = "Stain Protector", AlaCartePrice = 15.99m });
                break;
        }

        //both 'Custom' and 'Luxury' have the same services,
        //if 'Custom' was specified, change the 'PackageName' to 'Custom'
        if (packageName == "Custom")
        {
            for (int i = 0; i < carWashServices.Count; i++)
            {
                //update package name
                carWashServices[i].PackageName = "Custom";
            }
        }

        return carWashServices;
    }

    public static List<CarWashPackage> GetCarWashPackages()
    {
        return Packages;
    }
}

现在所有类都已创建。我们可以使用我们的

Form
(名称:Form1.cs)。

在表格中添加以下内容

  • 标签(名称:labelPackage;文本:“包”)
  • ComboBox(名称:comboBoxPackage;DropDownStyle:DropDownList)
  • GroupBox(名称:groupBoxInterior;文本:“Interior”)
  • GroupBox(名称:groupBoxExterior;文本:“外部”)

它应该类似于以下内容:

将以下内容添加到

groupBoxInterior
GroupBox

  • ListBox(名称:listBoxInterior)
  • Panel(名称:panelFragrance)

然后放置一个

Label
(名称:labelFragrance;文本:“Fragrance”)和一个`ComboBox


其他资源

© www.soinside.com 2019 - 2024. All rights reserved.