我正在尝试访问和更改对象绑定列表中对象的值。
我有一个包含这些包对象的包的绑定列表:
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;
}
我还有一个事件处理程序,当组合框选择的索引发生变化以根据选择的香水更新包的价格时,但是我如何访问包绑定列表中每个包的价格元素?
以下显示了一种可以将
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 中,但可以通过 Property 或 Method 访问。
创建类(名称: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)。
在表格中添加以下内容
它应该类似于以下内容:
将以下内容添加到
groupBoxInterior
GroupBox
然后放置一个
Label
(名称:labelFragrance;文本:“Fragrance”)和一个`ComboBox
其他资源: