2012-03-08 14 views
0

XMLファイルのデータを表示するdatagridviewがあります。 DGVはTaskTableと呼ばれます。 各行にチェックボックスがあり、チェックボックスが選択されている行を削除するボタンがあります。DGVとXMLファイルからデータを削除するチェックボックス

ただし、複数の行が必要なときに一度に1行しか削除できませんDGVファイルとバックエンドXMLファイルの両方から複数の行が選択されている場合は削除してください。ここで

が正常に一度に1行を削除しているコードです:

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

0
(すなわちループの外で)あなたのメソッドの最後に次の

TaskDataSet.WriteXml(fileURL); 
TaskDataSet.AcceptChanges(); // re writes xml file and removes deleted tasks. 

を移動し

さらに、私はあなたのテーブルの構造のわからないんだけど、あなたがしようとすることができる場合があります

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

返信いただきありがとうございます。私はあなたが提案したものを試しました(編集したコードスニペットを参照)。ただし、一度に1行ずつ削除するだけです。何か案は? – Rob

関連する問題