Удалить данные из DGV и XML-файлов, используя флажки - PullRequest
0 голосов
/ 08 марта 2012

У меня есть представление данных, которое отображает данные из файла 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.
    }

Пожалуйста, помогитечтобы я изменил свой код, что позволило мне удалить несколько задач одновременно.

Ответы [ 2 ]

1 голос
/ 08 марта 2012

Следующий код должен работать.Он создает список строк, которые нужно удалить, запрашивает подтверждение, а затем удаляет выбранные строки.

Удаление должно быть выполнено в порядке убывания индекса строки, чтобы предотвратить изменение индексами строк или строк, которые все еще остаютсянужно удалить.

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.
}
0 голосов
/ 08 марта 2012

Переместите следующее

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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...