Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/273.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何从C#中嵌套的可观察集合中移除子类?_C# - Fatal编程技术网

如何从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; } }
}