- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在使用 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
类型。
当然,如果您需要区分每个网格的多个按钮,则可以根据列名或索引进行选择,但这不应该是您的第一个检查。始终确保首先单击了一个按钮,然后再适本地处理其他任何事情。在大多数情况下,每个网格只有一个按钮,您可以立即跳转到比赛。
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
}
}
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
如果您想找点乐子,您可以添加自己的事件,以便在单击 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
如果我们使用的网格可以为我们完成这些事情,那就太好了。我们可以很容易地回答最初的问题:您已经向 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/
我遇到过这个 html: 上面的html和这个有什么区别: 最佳答案 来自MDN page on the tag : 对于 type 的属性标签,可能的值是: 提交:按钮将表单数据提交给服务器
Button button= (Button) findViewbyID(R.id.button); 和 Button button = new Button(this); 有什么区别? 最佳答案 有
我是一名优秀的程序员,十分优秀!