vb.net DataGridView指定列循环添加按钮,并循环添加按钮产生事件 报错集合已修改;可能无法执行枚举操作。,每行代码注释
时间: 2024-03-27 22:35:24 浏览: 64
DataGridView添加Button按钮
5星 · 资源好评率100%
好的,我来解答你的问题。首先,这个错误是因为你在循环遍历 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 函数为按钮的点击事件处理函数,具体实现可以根据你的需求来编写。
阅读全文