【问题标题】:Remove data from DGV and XML fileusing checkboxes使用复选框从 DGV 和 XML 文件中删除数据
【发布时间】:2012-03-08 14:16:09
【问题描述】:

我有一个显示来自 XML 文件的数据的 datagridview。 DGV 称为任务表。 我在每一行都有一个复选框和一个按钮,该按钮应该删除任何选中了复选框的行。

但是,如果同时从 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.
    }

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

【问题讨论】:

    标签: c# xml winforms datagridview checkbox


    【解决方案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.
    }
    

    【讨论】:

      【解决方案2】:

      移动以下

      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
      }
      

      【讨论】:

      • 感谢您的回复。我已经尝试了您的建议(请参阅编辑的代码 sn-p)。但是,它仍然一次只删除一行。有什么想法吗?
      猜你喜欢
      • 1970-01-01
      • 2017-11-26
      • 2014-03-10
      • 1970-01-01
      • 1970-01-01
      • 2012-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多