我有一个显示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.
}
请帮我修改我的代码,允许我一次删除多个任务。
答案 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
}