集合已修改;可能无法执行枚举操作.

有一段代码如下:

ContractedBlock.gif ExpandedBlockStart.gif Code

foreach (Campaign campaign in dgCampaign.SelectedItems)
{
    
if (campaign != null && !Resource.IsNullOrEmpty(campaign))
    {
        
//从DataGrid中的ItemSource中移除
        dgCampaign.ItemsSourceList.Remove(campaign);
        SC.Delete(campaign);
        i
++;
    }
}

用foreach语句执行删除操作时会报集合已修改,可能无法执行枚举操作。

而用for语句则没问题,如下:

ContractedBlock.gif ExpandedBlockStart.gif Code
//本就如下就可以了,但因为我的DataGrid还有其它操作,所以只能用其它方法
for (int j = 0; j < dgCampaign.SelectedItems.Count; j++)
{
    Campaign campaign 
= dgCampaign.SelectedItems[j] as Campaign;
    dgCampaign.ItemsSourceList.Remove(campaign);
    SC.Delete(campaign);
}

//现要求可以用如下方法实现
ResSet<Campaign> campaigns = new ResSet<Campaign>();
foreach (Campaign campaign in dgCampaign.SelectedItems)
{
    
if (campaign != null && !Resource.IsNullOrEmpty(campaign))
    {
        campaigns.Add(campaign);
    }
}
foreach (Campaign item in campaigns)
{
    dgCampaign.ItemsSourceList.Remove(item);
    SC.Delete(item);
}

 

注:

foreach 语句对实现 System.Collections.IEnumerable 或 System.Collections.Generic.IEnumerable<(Of <(T>)>) 接口的数组或对象集合中的每个元素重复一组嵌入式语句。foreach 语句用于循环访问集合,以获取您需要的信息,但不能用于在源集合中添加或移除项,否则可能产生不可预知的副作用。如果需要在源集合中添加或移除项,请使用 for 循环。

转载于:https://www.cnblogs.com/blackcore/archive/2009/11/13/1602310.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我来解答你的问题。首先,这个错误是因为你在循环遍历 DataGridView 的列时,同时又在其中添加了按钮,并且在添加按钮时触发了 DataGridView 的事件,导致了集合修改的错误。解决这个问题的方法有两种: 1. 使用一个额外的 List 来存储所有的按钮,遍历完 DataGridView 的列后再将所有按钮添加到 DataGridView 中。 2. 在添加按钮时先解除 DataGridView 的事件绑定,添加完按钮后再重新绑定事件。 下面是第一种方法的示例代码,其中假设 DataGridView 的名称为 dgv: ``` Dim btnList As New List(Of Button) ' 用来存储所有的按钮 For i As Integer = 0 To dgv.Columns.Count - 1 ' 遍历所有的列 Dim btn As New Button btn.Text = "按钮" & i btn.Tag = i ' 设置按钮的 Tag 属性为列的索引,方便后面处理点击事件时获取对应的列 btnList.Add(btn) ' 将按钮添加到 List 中 Next For i As Integer = 0 To dgv.Rows.Count - 1 ' 遍历所有的行 For j As Integer = 0 To btnList.Count - 1 ' 遍历所有的按钮 dgv.Rows(i).Cells.Add(btnList(j).Clone()) ' 将按钮添加到单元格中 Next Next AddHandler dgv.CellClick, AddressOf dgv_CellClick ' 绑定 DataGridView 的点击事件 ' DataGridView 点击事件处理函数 Private Sub dgv_CellClick(sender As Object, e As DataGridViewCellEventArgs) If e.ColumnIndex >= 0 AndAlso TypeOf dgv.Columns(e.ColumnIndex) Is DataGridViewButtonColumn Then ' 判断是否点击了按钮列 Dim btn As Button = dgv.Rows(e.RowIndex).Cells(e.ColumnIndex).Value ' 获取点击的按钮 Dim colIndex As Integer = CInt(btn.Tag) ' 获取按钮对应的列索引 ' 处理点击事件 MessageBox.Show("点击了第 " & e.RowIndex + 1 & " 行第 " & colIndex + 1 & " 列的按钮") End If End Sub ``` 如果你想要使用第二种方法,可以将添加按钮的代码修改为: ``` Dim btn As New Button btn.Text = "按钮" & i btn.Tag = i AddHandler btn.Click, AddressOf btn_Click ' 绑定按钮的点击事件 dgv.Rows(i).Cells.Add(btn) RemoveHandler dgv.CellClick, AddressOf dgv_CellClick ' 解除 DataGridView 的点击事件绑定 AddHandler dgv.CellClick, AddressOf dgv_CellClick ' 重新绑定 DataGridView 的点击事件 ``` 其中,btn_Click 函数为按钮的点击事件处理函数,具体实现可以根据你的需求来编写。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值