gpt4 book ai didi

c# - 如何处理Datagridview中Button Column的点击事件?

转载 作者:IT王子 更新时间:2023-10-29 03:33:24 26 4
gpt4 key购买 nike

我正在使用 C# 开发 Windows 应用程序。我正在使用 DataGridView 来显示数据。我在其中添加了一个按钮列。我想知道如何处理 DataGridView 中该按钮的点击事件。

最佳答案

您已将一个按钮添加到您的 DataGridView 并且您希望在单击该按钮时运行一些代码。

简单易行 - 只需按照以下步骤操作:

不要做

首先,以下是要做的事情:

我会避免此处其他一些答案中的建议,甚至由 documentation at MSDN 提供的建议对列索引或列名称进行硬编码以确定是否单击了按钮。单击事件为整个网格注册,因此您需要以某种方式确定单击了一个按钮,但是您不应该通过假设您的按钮位于特定的列名或索引中来这样做……有一种更简单的方法……

此外,请注意您要处理的事件。同样,文档和许多示例都弄错了。大多数示例处理 CellClick将触发的事件:

when any part of a cell is clicked.

...但也会在单击 标题时触发。这需要添加额外的代码来确定 e.RowIndex 值是否小于 0

而是处理 CellContentClick这只会发生:

when the content within a cell is clicked

无论出于何种原因, 标题也被视为单元格中的“内容”,因此我们仍然需要在下面进行检查。

任务

所以这是你应该做的:

首先,强制发件人键入 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 - 扩展网格

如果我们使用的网格可以为我们完成这些事情,那就太好了。我们可以很容易地回答最初的问题:您已经向 DataGridView 添加了一个按钮,并且您希望在单击该按钮时运行一些代码。下面是一种扩展 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

关于c# - 如何处理Datagridview中Button Column的点击事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3577297/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com