您已向DataGridView 添加了一个按钮,并且您希望在单击该按钮时运行一些代码。
简单易行 - 只需按照以下步骤操作:
注意事项
首先,这是不要做的事情:
我会避免这里的一些其他答案中的建议,甚至是documentation at MSDN 提供的对列索引或列名进行硬编码以确定是否单击了按钮。单击事件注册整个网格,因此您需要以某种方式确定按钮被单击,但您不应该通过假设您的按钮位于特定列名或索引中来这样做......有一种更简单的方法......
另外,请注意您要处理的事件。同样,文档和许多示例都弄错了。大多数示例处理将触发的CellClick 事件:
当单击单元格的任何部分时。
...但也会在单击 row 标题时触发。这需要添加额外的代码来确定e.RowIndex 值是否小于 0
改为处理仅发生的CellContentClick:
单击单元格内的内容时
无论出于何种原因,column 标头也被视为单元格中的“内容”,因此我们仍然需要在下面检查。
做事
所以你应该这样做:
首先,强制发送者键入DataGridView,以便在设计时公开其内部属性。您可以修改参数的类型,但这有时会使添加或删除处理程序变得棘手。
接下来,要查看是否单击了按钮,只需检查以确保引发事件的列的类型为 DataGridViewButtonColumn。因为我们已经将发送者类型转换为DataGridView,所以我们可以获取Columns 集合并使用e.ColumnIndex 选择当前列。然后检查该对象是否为DataGridViewButtonColumn 类型。
当然,如果您需要区分每个网格的多个按钮,则可以根据列名或索引进行选择,但这不应该是您的第一次检查。始终确保先单击按钮,然后适当地处理其他任何事情。在大多数情况下,每个网格只有一个按钮,您可以直接参加比赛。
把它们放在一起:
C#
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
var senderGrid = (DataGridView)sender;
if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn &&
e.RowIndex >= 0)
{
//TODO - Button Clicked - Execute Code Here
}
}
VB
Private Sub DataGridView1_CellContentClick(sender As System.Object, e As DataGridViewCellEventArgs) _
Handles DataGridView1.CellContentClick
Dim senderGrid = DirectCast(sender, DataGridView)
If TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso
e.RowIndex >= 0 Then
'TODO - Button Clicked - Execute Code Here
End If
End Sub
更新 1 - 自定义事件
如果您想获得一点乐趣,您可以添加自己的事件,以便在单击 DataGrid 上的按钮时引发。您不能将其添加到 DataGrid 本身,而不会弄乱继承等,但您可以将自定义事件添加到表单并在适当时触发它。代码有点多,但好处是您已经将单击按钮时想要执行的操作与如何确定是否单击了按钮分开。
只需声明一个事件,在适当的时候引发它并处理它。它看起来像这样:
Event DataGridView1ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs)
Private Sub DataGridView1_CellContentClick(sender As System.Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
Dim senderGrid = DirectCast(sender, DataGridView)
If TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso e.RowIndex >= 0 Then
RaiseEvent DataGridView1ButtonClick(senderGrid, e)
End If
End Sub
Private Sub DataGridView1_ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs) Handles Me.DataGridView1ButtonClick
'TODO - Button Clicked - Execute Code Here
End Sub
更新 2 - 扩展网格
如果我们使用一个能够为我们完成这些事情的网格,那就太好了。我们可以很容易地回答最初的问题:you've added a button to your DataGridView and you want to run some code when it's clicked。这是一种扩展DataGridView 的方法。为每个库提供自定义控件可能不值得麻烦,但至少它最大限度地重用了用于确定是否单击按钮的代码。
只需将其添加到您的程序集中:
Public Class DataGridViewExt : Inherits DataGridView
Event CellButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs)
Private Sub CellContentClicked(sender As System.Object, e As DataGridViewCellEventArgs) Handles Me.CellContentClick
If TypeOf Me.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso e.RowIndex >= 0 Then
RaiseEvent CellButtonClick(Me, e)
End If
End Sub
End Class
就是这样。永远不要再碰它。确保您的 DataGrid 是 DataGridViewExt 类型,它应该与 DataGridView 完全相同。除了它还会引发一个额外的事件,你可以像这样处理:
Private Sub DataGridView1_ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs) _
Handles DataGridView1.CellButtonClick
'TODO - Button Clicked - Execute Code Here
End Sub