使用复选框从DB和XML文件中删除数据

时间:2012-03-08 14:16:10

标签: c# xml winforms datagridview checkbox

我有一个显示XML文件数据的datagridview。 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.
    }

请帮我修改我的代码,允许我一次删除多个任务。

2 个答案:

答案 0 :(得分:1)

以下代码应该有效。它构建要删除的行列表,要求确认,然后删除所选行。

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

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.
}

答案 1 :(得分:0)

移动以下

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
}