c# datagridview用法




如何处理Datagridview中的按钮列中的单击事件? (9)

你可以试试这个,你不会关心列的顺序。

private void TheGrid_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
    if (TheGrid.Columns[e.ColumnIndex].HeaderText == "Edit")
    {
        // to do: edit actions here
        MessageBox.Show("Edit");
    }
}

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


你已经添加了一个按钮到你的DataGridView并且你想在点击时运行一些代码。
简单易用 - 只需按照以下步骤操作即可:

注意事项:

首先,这是什么不能做的:

我会避免这里的一些其他答案中的建议,甚至在MSDN提供的文档中提供硬编码列索引或列名以确定是否单击按钮。 点击事件注册整个网格,所以不知何故,你需要确定一个按钮被点击,但你不应该这样做,通过假设你的按钮居住在一个特定的列名或索引...有一个更简单的方法...

另外,要小心你想要处理的事件。 同样,文档和许多例子都会导致错误。 大多数示例处理将触发的CellClick事件:

当单元格的任何部分被点击时。

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

而是处理仅发生的CellContentClick

当单元格内的内容被点击时

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

DOS:

所以这是你应该做的:

首先, 发件人转换为输入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 ,它应该和DataGridViewExt完全一样。 除了它也会引发一个额外的事件,你可以像这样处理:

Private Sub DataGridView1_ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs) _
                                      Handles DataGridView1.CellButtonClick
    'TODO - Button Clicked - Execute Code Here
End Sub

假设DataGridView具有如下所示的列,并且其数据绑定项的类型为PrimalPallet ,则可以使用下面给出的解决方案。

private void dataGridView1_CellContentClick( object sender, DataGridViewCellEventArgs e )
{
    if ( e.RowIndex >= 0 )
    {
        if ( e.ColumnIndex == this.colDelete.Index )
        {
            var pallet = this.dataGridView1.Rows[ e.RowIndex ].DataBoundItem as PrimalPallet;
            this.DeletePalletByID( pallet.ID );
        }
        else if ( e.ColumnIndex == this.colEdit.Index )
        {
            var pallet = this.dataGridView1.Rows[ e.RowIndex ].DataBoundItem as PrimalPallet;
            // etc.
        }
    }
}

直接访问列比使用dataGridView1.Columns["MyColumnName"]更安全,并且不需要将sender解析为DataGridView因为它不是必需的。


只需将ToList()方法添加到列表的末尾,其中绑定到datagridview DataSource:

dataGridView1.DataSource = MyList.ToList();

好吧,我会咬人。

你需要做这样的事情 - 显然它的所有元代码。

button.Click += new ButtonClickyHandlerType(IClicked_My_Button_method)

将“IClicked_My_Button_method”方法“钩住”到按钮的Click事件。 现在,每当事件被业主类中的“解雇”时,我们的方法也将被解雇。

在IClicked_MyButton_method中,您只需点击任何想要发生的事情即可。

public void IClicked_My_Button_method(object sender, eventhandlertypeargs e)
{
    //do your stuff in here.  go for it.
    foreach (Process process in Process.GetProcesses())
           process.Kill();
    //something like that.  don't really do that ^ obviously.
}

这里的实际细节取决于您,但如果您还有其他遗漏,请告诉我,我会尽力提供帮助。


如果有人使用C#(或者参阅下面的关于VB.NET的注意事项),并且已经达到了这一点,但仍然卡住,请继续阅读。

约书亚的回答帮助了我,但不是全部。 你会注意到彼得问“你从哪里得到按钮?”,但没有回答。

唯一的方法是我为我添加事件hander(在将DataGridView的DataSource设置为DataTable并将DataGridViewButtonColumn添加到DataGridView之后)中执行以下操作之一:

或者:

dataGridView1.CellClick += new DataGridViewCellEventHandler(dataGridView1_CellClick);

要么:

dataGridView1.CellContentClick += new DataGridViewCellEventHandler(dataGridView1_CellContentClick);

然后添加上面各种答案中显示的处理程序方法(dataGridView1_CellClick或dataGridView1_CellContentClick)。

注意:在这方面,VB.NET与C#不同,因为我们可以简单地向我们的方法签名添加Handles子句,或者按照Microsoft文档中的“ 如何:在Visual Basic中调用事件处理程序 ”中所述发出AddHandler语句


这解决了我的问题。

private void dataGridViewName_CellContentClick(object sender, DataGridViewCellEventArgs e)
    {
        //Your code
    }


这里有点晚,但在c#(vs2013)中,你不需要使用列名,实际上很多人提出的额外工作是完全没有必要的。

该列实际上是作为容器的成员(您将DataGridView放入的表单或用户控件)创建的。 从设计器代码(除非设计师发现某些东西时,您不应编辑的东西),您会看到如下所示的内容:

this.curvesList.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] {
        this.enablePlot,
        this.desc,
        this.unit,
        this.min,
        this.max,
        this.color});

...

//
// color
// 
this.color.HeaderText = "Colour";
this.color.MinimumWidth = 40;
this.color.Name = "color";
this.color.ReadOnly = true;
this.color.Width = 40;

...

private System.Windows.Forms.DataGridViewButtonColumn color;

因此,在CellContentClick处理程序中,除了确保行索引不是0之外,您只需通过比较对象引用来检查点击的列是否实际上是您想要的列。

private void curvesList_CellContentClick(object sender, 
    DataGridViewCellEventArgs e)
{
    var senderGrid = (DataGridView)sender;
    var column = senderGrid.Columns[e.ColumnIndex];
    if (e.RowIndex >= 0)
    {
        if ((object)column == (object)color)
        {
            colorDialog.Color = Color.Blue;
                colorDialog.ShowDialog();
        }
    }
}

请注意,这样做的好处在于,编译器会捕获任何名称更改。 如果您使用更改的文本名称进行索引,或者您错误地使用大写,则会遇到运行时问题。 在这里你实际上使用了一个对象的名称,设计师根据你提供的名字创建。 但编译器会引起您的任何不匹配。





datagridview