C# 使用复选框从DGV和XML文件中删除数据
我有一个datagridview,它显示XML文件中的数据。DGV称为TaskTable。 我在每一行中都有一个复选框和一个按钮,可以删除在中选中复选框的任何行 但是,如果同时从DGV和后端XML文件中选择了多行,那么当我需要删除多行时,此时我一次只能删除一行 下面是一次成功删除一行的代码:C# 使用复选框从DGV和XML文件中删除数据,c#,xml,winforms,datagridview,checkbox,C#,Xml,Winforms,Datagridview,Checkbox,我有一个datagridview,它显示XML文件中的数据。DGV称为TaskTable。 我在每一行中都有一个复选框和一个按钮,可以删除在中选中复选框的任何行 但是,如果同时从DGV和后端XML文件中选择了多行,那么当我需要删除多行时,此时我一次只能删除一行 下面是一次成功删除一行的代码: private void RemoveButton_Click_1(object sender, EventArgs e) // removes checked tasks. { i
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.
}
private void remove按钮\u单击\u 1(对象发送者,事件参数)//删除选中的任务。
{
int i=0;
{
对于(i=0;i移动以下内容
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
}
private void remove按钮\单击(对象发送者,事件参数e)
{
List rowsToRemove=新建。。。
foreach(此.TaskTable.SelectedRows中的DataGridViewRow项)
{
if(item.Cells[0].Value!=null)
{
if((bool)项.Cells[0]。值==true)
{
if(MessageBox.Show(…)//确认
{
rowsToRemove.Add(项目);
}
}
}
}
foreach(rowsToRemove中的变量行)
{
this.TaskTable.Rows.Remove(row);
}
//编写xml
//接受更改
}
下面的代码应该可以工作。它构建一个要删除的行列表,请求确认,然后删除所选行
删除必须按行索引降序进行,以防止删除更改行索引或仍需要删除的行
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.
}
private void remove按钮\u单击\u 1(对象发送者,事件参数)//删除选中的任务。
{
List rowsToRemove=新列表();
int i=0;
对于(i=0;i x))
{
TaskTable.Rows.RemoveAt(rowIndex);
}
}
TaskDataSet.WriteXml(fileURL);
TaskDataSet.AcceptChanges();//重新写入xml文件并删除已删除的任务。
}
谢谢您的回复。我已经尝试了您的建议(请参阅编辑的代码段)。但是,它仍然是一次只删除一行。有什么想法吗?