2012-03-08 77 views
0

我有一個顯示XML文件數據的datagridview。 DGV被稱爲TaskTable。 我有一個複選框在每一行和一個按鈕,應該刪除任何有一個複選框選中的行。使用複選框刪除DGV和XML文件中的數據

但是,此刻我只能得到一行被刪除,當我需要多行如果從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. 
    } 

請幫我修改我的代碼,讓我一次刪除多個任務。

回答

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

這很好。非常感謝! – Rob 2012-03-08 14:50:37

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 
} 
+0

感謝您的回覆。我嘗試了你的建議(請參閱編輯的代碼片段)。但是,它一次只能刪除一行。有任何想法嗎? – Rob 2012-03-08 14:32:06