C# 使用复选框从DGV和XML文件中删除数据

C# 使用复选框从DGV和XML文件中删除数据,c#,xml,winforms,datagridview,checkbox,C#,Xml,Winforms,Datagridview,Checkbox,我有一个datagridview,它显示XML文件中的数据。DGV称为TaskTable。 我在每一行中都有一个复选框和一个按钮,可以删除在中选中复选框的任何行 但是,如果同时从DGV和后端XML文件中选择了多行,那么当我需要删除多行时,此时我一次只能删除一行 下面是一次成功删除一行的代码: private void RemoveButton_Click_1(object sender, EventArgs e) // removes checked tasks. { i

我有一个datagridview,它显示XML文件中的数据。DGV称为TaskTable。 我在每一行中都有一个复选框和一个按钮,可以删除在中选中复选框的任何行

但是,如果同时从DGV和后端XML文件中选择了多行,那么当我需要删除多行时,此时我一次只能删除一行

下面是一次成功删除一行的代码:

private void RemoveButton_Click_1(object sender, EventArgs e) // removes checked tasks.
    {
        int i = 0;
        {
            for (i = 0; i <= TaskTable.Rows.Count - 1; i++)
            {

                if (TaskTable.Rows[i].Cells[0].Value != null)
                {

                    if ((bool)TaskTable.Rows[i].Cells[0].Value == true)
                    {
                        if (MessageBox.Show("Are you sure you want to remove the selected task?", "Confirm Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) // confirmation
                        {
                            TaskTable.Rows.RemoveAt(i); //Here If Checkbox Selected Then It Will Delete The Row From The GridView

                        }

                    }


                }
            }
        }
         TaskDataSet.WriteXml(fileURL);
         TaskDataSet.AcceptChanges(); // re writes xml file and removes deleted tasks.
    }
private void remove按钮\u单击\u 1(对象发送者,事件参数)//删除选中的任务。
{
int i=0;
{
对于(i=0;i移动以下内容

TaskDataSet.WriteXml(fileURL);
TaskDataSet.AcceptChanges(); // re writes xml file and removes deleted tasks.
到方法的末尾(即在for循环之外)

此外,我不确定您的表的结构,但您可以尝试:

private void RemoveButton_Click_1(object sender, EventArgs e)
{
    foreach (DataGridViewRow item in this.TaskTable.SelectedRows)
    {
        TaskTable.Rows.RemoveAt(item.Index);
    }
    TaskDataSet.WriteXml(fileURL);
    TaskDataSet.AcceptChanges();
}
如果这不是您的选择,我建议您迭代行并存储选定的行,然后在第一个循环之外删除已存储的行,大致如下:

private void RemoveButton_Click(object sender, EventArgs e)
{
    List<DaraGridViewRow> rowsToRemove = new ...
    foreach (DataGridViewRow item in this.TaskTable.SelectedRows)
    {
        if (item.Cells[0].Value != null)
        {
            if ((bool)item.Cells[0].Value == true)
            {
                if (MessageBox.Show(...) // confirmation
                {
                    rowsToRemove.Add(item);
                }
            }
        }
    }
    foreach(var row in rowsToRemove)
    {
          this.TaskTable.Rows.Remove(row);
    }
    // write xml
    // accept changes
}
private void remove按钮\单击(对象发送者,事件参数e)
{
List rowsToRemove=新建。。。
foreach(此.TaskTable.SelectedRows中的DataGridViewRow项)
{
if(item.Cells[0].Value!=null)
{
if((bool)项.Cells[0]。值==true)
{
if(MessageBox.Show(…)//确认
{
rowsToRemove.Add(项目);
}
}
}
}
foreach(rowsToRemove中的变量行)
{
this.TaskTable.Rows.Remove(row);
}
//编写xml
//接受更改
}

下面的代码应该可以工作。它构建一个要删除的行列表,请求确认,然后删除所选行

删除必须按行索引降序进行,以防止删除更改行索引或仍需要删除的行

private void RemoveButton_Click_1(object sender, EventArgs e) // removes checked tasks.
{
    List<int> rowsToRemove = new List<int>();
    int i = 0;

    for (i = 0; i <= TaskTable.Rows.Count - 1; i++)
    {

        if (TaskTable.Rows[i].Cells[0].Value != null)
        {

            if ((bool)TaskTable.Rows[i].Cells[0].Value == true)
            {
                rowsToRemove.Add(i);
            }
        }
    }

    if (MessageBox.Show("Are you sure you want to remove the selected tasks?", "Confirm Delete", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) // confirmation
    {
        // delete rows in reverse order of row index so row indexes are preserved
        foreach (int rowIndex in rowsToRemove.OrderByDescending(x=>x))
        {
            TaskTable.Rows.RemoveAt(rowIndex); 
        }


    }

    TaskDataSet.WriteXml(fileURL);
    TaskDataSet.AcceptChanges(); // re writes xml file and removes deleted tasks.
}
private void remove按钮\u单击\u 1(对象发送者,事件参数)//删除选中的任务。
{
List rowsToRemove=新列表();
int i=0;
对于(i=0;i x))
{
TaskTable.Rows.RemoveAt(rowIndex);
}
}
TaskDataSet.WriteXml(fileURL);
TaskDataSet.AcceptChanges();//重新写入xml文件并删除已删除的任务。
}

谢谢您的回复。我已经尝试了您的建议(请参阅编辑的代码段)。但是,它仍然是一次只删除一行。有什么想法吗?