C# 清除datagridview重复行并保留唯一行

C# 清除datagridview重复行并保留唯一行,c#,winforms,datagridview,C#,Winforms,Datagridview,因此,在填充datagridview时,我通常会执行以下操作 public void FillTable(CoBRAMetaField[] metaFields) { dataGridView.Rows.Clear(); // do something with metaFields } 重要提示: CoBRAMetaField是一个具有ID和其他内容的对象 网格中的每一行都包含一个元字段对象 我的表格填写正确(对不起,语言是德语)

因此,在填充datagridview时,我通常会执行以下操作

    public void FillTable(CoBRAMetaField[] metaFields)
    {
        dataGridView.Rows.Clear();

        // do something with metaFields
    }
重要提示:

  • CoBRAMetaField
    是一个具有ID和其他内容的对象

  • 网格中的每一行都包含一个元字段对象

我的表格填写正确(对不起,语言是德语)

当我再次填充网格时,我只想删除包含新元字段数组中不存在的元字段的行。我想要这种行为,因为当用户为此行选择一个值时,我不希望它被删除并再次创建,因为这样所选的值也会被删除

我想到了这个

    public void FillTable(CoBRAMetaField[] metaFields)
    {
        for (int i = 0; i < dataGridView.Rows.Count; i++) // loop through the grid rows
        {
            double metaFieldID = (dataGridView.Rows[i].Cells[0].Tag as CoBRAMetaField).ID; // get the ID from the row metaField

            if (metaFields.Any(field => field.ID == metaFieldID)) // Does it exist?
                metaFields = metaFields.Where(field => field.ID != metaFieldID).ToArray(); // Remove it from the new array
            else // it doesn't exist
                dataGridView.Rows.Remove(dataGridView.Rows[i]); // remove the row
        }

        // Fill the grid with the remaining metaFields
    }

如果您只想复制粘贴,但也可以通过表单设计器进行复制粘贴。查看
dataGridView.Rows.Clear()这提供了一个工作示例注释掉它并使用上面的代码测试错误的示例

主要问题在于添加行的代码(取自链接):

这将从根本上解决原来的问题

代码的删除部分也有问题-for
循环将无法检查删除行旁边的行。在迭代过程中,任何时候您想要迭代某些列表并删除项目,请对
循环使用反向
,并
删除

for (int i = dataGridView.Rows.Count - 1; i >= 0; i--) // <--
{
    double metaFieldID = (dataGridView.Rows[i].Cells[0].Tag as MetaField).ID;

    if (metaFields.Any(field => field.ID == metaFieldID))
        metaFields = metaFields.Where(field => field.ID != metaFieldID).ToArray();
    else
        dataGridView.Rows.RemoveAt(i); // <--
}
for(int i=dataGridView.Rows.Count-1;i>=0;i--)//field.ID==metaFieldID))
metaFields=metaFields.Where(field=>field.ID!=metaFieldID.ToArray();
其他的

dataGridView.Rows.RemoveAt(i);//您提供的链接是空的。好吧,这很奇怪,我更新了它。发布/链接的代码中缺少很多内容。以下变量没有定义…
CoBRAMetaField[]
ReleaseSetUpData
FieldName
…如果没有这些定义,可能很难找到帮助。此外,还有一个指向某些代码的链接,这些代码似乎没有在任何地方使用。在哪里使用了
MetaFieldTable
类?您的评论…“我将在这里提供一个完整的示例,但我认为不需要”…我认为它是需要的。@JohnG我很抱歉。现在,如果有人想要复制项目,您可以举一个完整的工作示例。当我再次填充网格时,我只想删除包含新元字段数组中不存在的元字段的行。-那么,为什么不干脆清除行并添加新数组中的所有行呢?这正是我所需要的
// Fill the grid with the remaining metaFields
for (int i = 0; i < metaFields.Length; i++)
{
    MetaField currentMetaField = metaFields[i];

    dataGridView.Rows.Add(currentMetaField.Name, null);

    DataGridViewRow newRow = dataGridView.Rows[i]; // <-- Problem!

    DataGridViewCell metaFieldCell = newRow.Cells[0];
    metaFieldCell.Tag = currentMetaField;

    (newRow.Cells[1] as DataGridViewAllocationCell).Initialize(releaseSetupData);
}
int rowIndex = dataGridView.Rows.Add(currentMetaField.Name, null);

DataGridViewRow newRow = dataGridView.Rows[rowIndex];
for (int i = dataGridView.Rows.Count - 1; i >= 0; i--) // <--
{
    double metaFieldID = (dataGridView.Rows[i].Cells[0].Tag as MetaField).ID;

    if (metaFields.Any(field => field.ID == metaFieldID))
        metaFields = metaFields.Where(field => field.ID != metaFieldID).ToArray();
    else
        dataGridView.Rows.RemoveAt(i); // <--
}