如何从C#中嵌套的可观察集合中移除子类?
我有一个嵌套的发票可观察集合,目前正在使用底部的代码从网格控件中删除选定的行。发票的一个例子是:如何从C#中嵌套的可观察集合中移除子类?,c#,C#,我有一个嵌套的发票可观察集合,目前正在使用底部的代码从网格控件中删除选定的行。发票的一个例子是: ---------------------------------------------------- | Item Name | Quantity | Unit Price | Total Price | ---------------------------------------------------- - | Coffee | 1 | 1.00
----------------------------------------------------
| Item Name | Quantity | Unit Price | Total Price |
----------------------------------------------------
- | Coffee | 1 | 1.00 | 1.00 |
-------------------------------------------------
| Item Name | Quantity | Unit Price | Total Price |
-------------------------------------------------
| Creamer | 1 | 1.00 | 1.00 |
| Sugar | 1 | 1.00 | 1.00 |
----------------------------------------------------
- | Bread | 1 | 1.00 | 1.00 |
-------------------------------------------------
| Item Name | Quantity | Unit Price | Total Price |
-------------------------------------------------
| Cheese | 1 | 1.00 | 1.00 |
----------------------------------------------------
+ | Water | 1 | 1.00 | 1.00 |
----------------------------------------------------
如果我选择咖啡
、面包
或水
,它将成功删除该项目及其子项目
但是,如果我选择了Creamer
、Sugar
或Cheese
,它会删除父项,从而删除它拥有的每个子项
我的代码是:
int rowUID=Convert.ToInt32(invoiceGC.GetFocusedRowCellValue(“InvoiceItemUID”);
对于(int i=0;i
我的班级是:
public类InvoiceItemMainClass
{
私有字符串invoiceItemMainName;
私有十进制InvoiceItemMain数量;
私有十进制InvoiceItemMain单价;
私有十进制invoiceItemMainTotalPrice;
私有int invoiceItemID;
私有int invoiceItemUID;
私人可观测收款发票项子项;
公共InvoiceItemMainClass(字符串invoiceItemMainName、十进制invoiceItemMainQuantity、十进制invoiceItemMainUnitPrice、十进制invoiceItemMainTotalPrice、int invoiceItemID、int invoiceItemUID)
{
this.invoiceItemMainName=invoiceItemMainName;
this.invoiceItemMainQuantity=invoiceItemMainQuantity;
this.invoiceItemMainUnitPrice=invoiceItemMainUnitPrice;
this.invoiceItemMainTotalPrice=invoiceItemMainTotalPrice;
this.invoiceItemID=invoiceItemID;
this.invoiceItemUID=invoiceItemUID;
this.invoiceItemSub=新的ObservableCollection();
}
公共字符串InvoiceItemMainName{get{return InvoiceItemMainName;}set{InvoiceItemMainName=value;}}
公共十进制InvoiceItemMainQuantity{get{return InvoiceItemMainQuantity;}set{InvoiceItemMainQuantity=value;}}
公共十进制InvoiceItemMainUnitPrice{get{return InvoiceItemMainUnitPrice;}set{InvoiceItemMainUnitPrice=value;}}
公共十进制InvoiceItemMainTotalPrice{get{return InvoiceItemMainTotalPrice;}set{InvoiceItemMainTotalPrice=value;}}
public int InvoiceItemID{get{return InvoiceItemID;}set{InvoiceItemID=value;}}
public int InvoiceItemUID{get{return InvoiceItemUID;}set{InvoiceItemUID=value;}}
public observeCollection InvoiceItemSub{get{return InvoiceItemSub;}}
}
公共类InvoiceItemSubClass
{
私有字符串invoiceItemSubName;
专用十进制发票项子数量;
私人十进制发票价格;
私人十进制发票项目小计价格;
私有int invoiceItemID;
私有int invoiceItemUID;
公共InvoiceItemSubClass(字符串invoiceItemSubName、十进制invoiceItemSubQuantity、十进制invoiceItemSubUnitPrice、十进制invoiceItemSubTotalPrice、int invoiceItemID、int invoiceItemUID)
{
this.invoiceItemSubName=invoiceItemSubName;
this.invoiceItemSubQuantity=invoiceItemSubQuantity;
this.invoiceItemSubUnitPrice=invoiceItemSubUnitPrice;
this.invoiceItemSubTotalPrice=invoiceItemSubTotalPrice;
this.invoiceItemID=invoiceItemID;
this.invoiceItemUID=invoiceItemUID;
}
公共字符串InvoiceItemSubName{get{return InvoiceItemSubName;}set{InvoiceItemSubName=value;}}
公共十进制InvoiceItemSubQuantity{get{return InvoiceItemSubQuantity;}set{InvoiceItemSubQuantity=value;}}
公共十进制InvoiceItemSubUnitPrice{get{return InvoiceItemSubUnitPrice;}set{InvoiceItemSubUnitPrice=value;}}
公共十进制InvoiceItemSubTotalPrice{get{return InvoiceItemSubTotalPrice;}set{InvoiceItemSubTotalPrice=value;}}
public int InvoiceItemID{get{return InvoiceItemID;}set{InvoiceItemID=value;}}
public int InvoiceItemUID{get{return InvoiceItemUID;}set{InvoiceItemUID=value;}}
}
根据您的删除逻辑,它将始终删除父级
考虑到你的父母项目是“咖啡”ID为1,它有子项目“糖”ID为1现在当你选择“糖”(这是子项目与ID = 1),并循环通过项目,它与父项目“咖啡”和删除和你的循环中断。
要从父项中删除子项,您需要以不同的方法提供两个参数/参数1)父项Id和子项Id,然后您可以从父项的子项集合中删除子项。我特意创建了UID或Unique Id,以解决有条件使用重复值的问题,它们在向集合中添加项时会被迭代,因此即使我删除了一个项,它们的值也不会相同。该项几乎是sql的Id,只有在我重新启动应用程序时才会被截断。下面的UID是
Bread=1
,Creamer=2
等等,直到Water=6
为止。我修复了它,虽然您的解决方案没有完全帮助我,我仍然要感谢你,因为你让我仔细检查我得到的是哪一行,结果发现问题出在我如何存储聚焦行上。@KlausBean很高兴知道你发现了问题并解决了它:)我终于得到了它,结果发现问题出在我如何获得聚焦行id的值上。GetFocusedRowCellValue不适用于GridControl主细节上的细节行。我必须使用这个代码,我
int rowUID = Convert.ToInt32(invoiceGC.GetFocusedRowCellValue("InvoiceItemUID"));
for (int i=0; i < Invoice.Count(); i++)
{
if(Invoice[i].InvoiceItemUID == rowUID)
{
Invoice.Remove(Invoice[i]);
break;
}
else
{
bool subDelete = false;
for (int j=0; j < Invoice[i].InvoiceItemSub.Count(); j++)
{
if (Invoice[i].InvoiceItemSub[j].InvoiceItemUID == rowUID)
{
Invoice[i].InvoiceItemSub.Remove(Invoice[i].InvoiceItemSub[j]);
subDelete = true;
break;
}
}
if(subDelete == true)
{
break;
}
}
}
public class InvoiceItemMainClass
{
private string invoiceItemMainName;
private decimal invoiceItemMainQuantity;
private decimal invoiceItemMainUnitPrice;
private decimal invoiceItemMainTotalPrice;
private int invoiceItemID;
private int invoiceItemUID;
private ObservableCollection<InvoiceItemSubClass> invoiceItemSub;
public InvoiceItemMainClass(string invoiceItemMainName, decimal invoiceItemMainQuantity, decimal invoiceItemMainUnitPrice, decimal invoiceItemMainTotalPrice, int invoiceItemID, int invoiceItemUID)
{
this.invoiceItemMainName = invoiceItemMainName;
this.invoiceItemMainQuantity = invoiceItemMainQuantity;
this.invoiceItemMainUnitPrice = invoiceItemMainUnitPrice;
this.invoiceItemMainTotalPrice = invoiceItemMainTotalPrice;
this.invoiceItemID = invoiceItemID;
this.invoiceItemUID = invoiceItemUID;
this.invoiceItemSub = new ObservableCollection<InvoiceItemSubClass>();
}
public string InvoiceItemMainName { get { return invoiceItemMainName; } set { invoiceItemMainName = value; } }
public decimal InvoiceItemMainQuantity { get { return invoiceItemMainQuantity; } set { invoiceItemMainQuantity = value; } }
public decimal InvoiceItemMainUnitPrice { get { return invoiceItemMainUnitPrice; } set { invoiceItemMainUnitPrice = value; } }
public decimal InvoiceItemMainTotalPrice { get { return invoiceItemMainTotalPrice; } set { invoiceItemMainTotalPrice = value; } }
public int InvoiceItemID { get { return invoiceItemID; } set { invoiceItemID = value; } }
public int InvoiceItemUID { get { return invoiceItemUID; } set { invoiceItemUID = value; } }
public ObservableCollection<InvoiceItemSubClass> InvoiceItemSub { get { return invoiceItemSub; } }
}
public class InvoiceItemSubClass
{
private string invoiceItemSubName;
private decimal invoiceItemSubQuantity;
private decimal invoiceItemSubUnitPrice;
private decimal invoiceItemSubTotalPrice;
private int invoiceItemID;
private int invoiceItemUID;
public InvoiceItemSubClass(string invoiceItemSubName, decimal invoiceItemSubQuantity, decimal invoiceItemSubUnitPrice, decimal invoiceItemSubTotalPrice, int invoiceItemID, int invoiceItemUID)
{
this.invoiceItemSubName = invoiceItemSubName;
this.invoiceItemSubQuantity = invoiceItemSubQuantity;
this.invoiceItemSubUnitPrice = invoiceItemSubUnitPrice;
this.invoiceItemSubTotalPrice = invoiceItemSubTotalPrice;
this.invoiceItemID = invoiceItemID;
this.invoiceItemUID = invoiceItemUID;
}
public string InvoiceItemSubName { get { return invoiceItemSubName; } set { invoiceItemSubName = value; } }
public decimal InvoiceItemSubQuantity { get { return invoiceItemSubQuantity; } set { invoiceItemSubQuantity = value; } }
public decimal InvoiceItemSubUnitPrice { get { return invoiceItemSubUnitPrice; } set { invoiceItemSubUnitPrice = value; } }
public decimal InvoiceItemSubTotalPrice { get { return invoiceItemSubTotalPrice; } set { invoiceItemSubTotalPrice = value; } }
public int InvoiceItemID { get { return invoiceItemID; } set { invoiceItemID = value; } }
public int InvoiceItemUID { get { return invoiceItemUID; } set { invoiceItemUID = value; } }
}