删除DataGridViews中的多行

时间:2019-04-25 15:29:22

标签: c# .net winforms class datagridview

我有一个定义如下的父类:

AbortSystemShutdown

请注意,Child_Name的格式如下:Parent_Name +“-” +一个整数。

然后以相同的形式创建两个DataGridView(dt1和dt2)。在dt1上,每行显示Parent_Name,在dt2上,每行显示Child_Name。每个父母可以有多个孩子(列表)。

现在我要: -删除dt1上的父级(一行),它也会删除dt2中的所有关联子级(但不删除其他父级的子级)。

到目前为止,我要做的是

using System.Collections.Generic;

namespace Test
{
    public class GeneralClass
    {
        public class Parent
        {
            public string Parent_Name { get; set; }
            public List<Child> List_Child { get; set; } = new List<Child>();
        }

        public class Child
        {
            public string Child_Name { get; set; }
        }
    }
}

它按预期方式删除了选定的父级,但仅删除了该父级的第一个孩子(而不删除其他)。我在哪里做错了?

非常感谢您!

1 个答案:

答案 0 :(得分:0)

您不应尝试从正在迭代的同一集合中删除项目。
如果从集合中删除项目,则foreach迭代器将处于不可能的情况。它将不再能够正确找到迭代中的下一行。就像https://code.djangoproject.com/ticket/28859

此处使用的老技巧是使用正常的for..loop 从集合的最后一项开始浏览行集合。因此,当您删除项目时,计数器(x)会减少,并且您不会跳过循环中的任何行。

foreach (DataGridViewRow row_dt1 in dt1.SelectedRows)
{
    if (!row.IsNewRow)
    {
        // Find parent name of actual row
        string parent_name = row_dt1.Cells[0].Value.ToString();
        // Iteration over all rows of children
        for(int x = dt2.Rows.Count - 1; x >= 0; x--)
        {
            // Find child name
            DataGridViewRow row_dt2 = dt2.Rows[x];
            object val1 = row_dt2.Cells[0].Value;
            // If child name starts with parent name, remove this child from the DataGridView (dt2)
            if (val1 != null && val1.ToString().StartsWith(parent_name + "-"))
            {
                dt2.Rows.Remove(row_dt2);
            }
        }
        // Now remove the parent from dt1
        dt1.Rows.Remove(row_dt1);
    }
}